From 26d858ae18cf0d593914cc395a9b9868f547ba47 Mon Sep 17 00:00:00 2001 From: Junyi Date: Mon, 17 Mar 2025 12:27:42 +0800 Subject: [PATCH] fix(plugin-workflow-manual): fix migration (#6484) --- .../20250312100513-change-table-name.test.ts | 68 +++++++++++++++++++ .../20250312100513-change-table-name.ts | 47 +++++++++++++ 2 files changed, 115 insertions(+) diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/migrations/20250312100513-change-table-name.test.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/migrations/20250312100513-change-table-name.test.ts index 07317d2869..d13adf718b 100644 --- a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/migrations/20250312100513-change-table-name.test.ts +++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/migrations/20250312100513-change-table-name.test.ts @@ -281,4 +281,72 @@ describe('20250225175712-change-table-name.test', () => { await app.destroy(); }); + + skipSqlite(`1.6.0 -> 1.6.2, wrong migration executed (with id)`, async () => { + const app = await createMockServer(); + await app.version.update('1.5.0'); + app.db.collection({ + name: 'workflowManualTasks', + migrationRules: ['schema-only'], + shared: true, + autoGenId: false, + fields: [ + { + type: 'bigInt', + name: 'id', + }, + { + type: 'bigInt', + name: 'userId', + primaryKey: true, + }, + { + type: 'bigInt', + name: 'jobId', + primaryKey: true, + }, + ], + }); + await app.db.sync(); + app.db.removeCollection('workflowManualTasks'); + const migration = new Migration({ db: app.db, app } as any); + await migration.up(); + app.db.collection({ + ...workflowManualTasks, + }); + await app.db.sync(); + await app.destroy(); + }); + + skipSqlite(`1.6.0 -> 1.6.2, wrong migration executed`, async () => { + const app = await createMockServer(); + await app.version.update('1.5.0'); + app.db.collection({ + name: 'workflowManualTasks', + migrationRules: ['schema-only'], + shared: true, + autoGenId: false, + fields: [ + { + type: 'bigInt', + name: 'userId', + primaryKey: true, + }, + { + type: 'bigInt', + name: 'jobId', + primaryKey: true, + }, + ], + }); + await app.db.sync(); + app.db.removeCollection('workflowManualTasks'); + const migration = new Migration({ db: app.db, app } as any); + await migration.up(); + app.db.collection({ + ...workflowManualTasks, + }); + await app.db.sync(); + await app.destroy(); + }); }); diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/migrations/20250312100513-change-table-name.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/migrations/20250312100513-change-table-name.ts index 6651150bab..f1f18c4df9 100644 --- a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/migrations/20250312100513-change-table-name.ts +++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/migrations/20250312100513-change-table-name.ts @@ -32,6 +32,53 @@ export default class extends Migration { const exists = await queryInterface.tableExists(oldTableName); if (!exists) { + const newColumns = await queryInterface.describeTable(newTableName); + const newPrimaryKeys = Object.values(newColumns).filter((c) => c.primaryKey); + if (newPrimaryKeys.length > 1) { + // @ts-ignore + const constraints: any = await queryInterface.showConstraint(newTableName); + await db.sequelize.transaction( + { + isolationLevel: Transaction.ISOLATION_LEVELS.SERIALIZABLE, + }, + async (transaction) => { + if (this.db.isPostgresCompatibleDialect()) { + const primaryKeys = constraints.filter((item) => item.constraintType === 'PRIMARY KEY'); + if (primaryKeys.length) { + for (const primaryKey of primaryKeys) { + await queryInterface.removeConstraint(newTableName, primaryKey.constraintName, { transaction }); + } + } + } else if (this.db.isMySQLCompatibleDialect()) { + const idExists = await workflowManualTasksCollection.getField('id').existsInDb(); + if (!idExists) { + await db.sequelize.query(`ALTER TABLE ${newTableNameWithQuotes} ADD COLUMN id BIGINT;`, { + transaction, + }); + await db.sequelize.query(`ALTER TABLE ${newTableNameWithQuotes} DROP PRIMARY KEY`, { + transaction, + }); + await db.sequelize.query(`ALTER TABLE ${newTableNameWithQuotes} ADD PRIMARY KEY (id)`, { + transaction, + }); + await db.sequelize.query( + `ALTER TABLE ${newTableNameWithQuotes} MODIFY COLUMN id BIGINT AUTO_INCREMENT`, + { + transaction, + }, + ); + } else { + await db.sequelize.query(`ALTER TABLE ${newTableNameWithQuotes} DROP PRIMARY KEY`, { + transaction, + }); + await db.sequelize.query(`ALTER TABLE ${newTableNameWithQuotes} ADD PRIMARY KEY (id)`, { + transaction, + }); + } + } + }, + ); + } return; } const oldColumns = await queryInterface.describeTable(oldTableName);