tachybase_todo/packages/plugins/collection-manager/src/migrations/20220704225714-drop-foreign-keys.ts
2022-07-04 23:48:19 +08:00

46 lines
1.6 KiB
TypeScript

import { Migration } from '@nocobase/server';
export default class DropForeignKeysMigration extends Migration {
async up() {
const result = await this.app.version.satisfies('<=0.7.1-alpha.7');
if (!result) {
return;
}
const transaction = await this.db.sequelize.transaction();
try {
if (this.db.inDialect('mysql')) {
const [results]: any = await this.db.sequelize.query(
`
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,' ;') as q
FROM information_schema.TABLE_CONSTRAINTS c
WHERE c.TABLE_SCHEMA='${this.db.options.database}' AND c.CONSTRAINT_TYPE='FOREIGN KEY';
`,
{ transaction },
);
for (const result of results) {
await this.db.sequelize.query(result.q as any, { transaction });
}
} else if (this.db.inDialect('postgres')) {
const [results]: any = await this.db.sequelize.query(
`
select 'alter table '||quote_ident(tb.relname)||
' drop constraint '||quote_ident(conname)||';' as q
from pg_constraint c
join pg_class tb on tb.oid = c.conrelid
join pg_namespace ns on ns.oid = tb.relnamespace
where ns.nspname in ('public')
and c.contype = 'f';
`,
{ transaction },
);
for (const result of results) {
await this.db.sequelize.query(result.q as any, { transaction });
}
}
await transaction.commit();
} catch (error) {
await transaction.rollback();
}
}
}