我们在 nodejs 项目中使用 sequelize 和 Umzug 来进行所需的数据库更改。数据库中的所有数据都能在版本之间的迁移中幸存下来,这一点非常重要,因为我们讨论了解决方案的几个有效使用实例的迁移。
只要没有外键约束,Sequelize 就可以很好地工作。
在我们的场景中,我们有一个现有的表“devices”,它的外键约束设置为另一个表“basedata”->“id”。现在我需要删除表“设备”中的非空约束。我尝试使用以下迁移脚本执行此操作:
const { Sequelize } = require('sequelize');
module.exports = {
up: async (queryInterface) => {
await queryInterface.changeColumn('devices', 'basedataId', {
type: Sequelize.BIGINT,
allowNull: true,
references: {
model: 'basedata',
key: 'id'
}
});
}
};
这失败并出现以下错误:
<rejected> ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
at Query.formatError (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:366:18)
at Query._handleQueryResponse (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:72:18)
at Statement.afterExecute (C:\....\node_modules\sequelize\lib\dialects\sqlite\query.js:246:27) {
parent: [Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed] {
errno: 19,
code: 'SQLITE_CONSTRAINT',
sql: 'DROP TABLE `devices`;'
},
original: [Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed] {
errno: 19,
code: 'SQLITE_CONSTRAINT',
sql: 'DROP TABLE `devices`;'
},
sql: 'DROP TABLE `devices`;',
parameters: undefined,
fields: undefined,
table: undefined,
value: undefined,
index: undefined,
reltype: undefined
}
}
} reason: SequelizeForeignKeyConstraintError: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
在我看来,sequelize 会构建已更改的表并尝试删除现有的表,然后再将新表重命名为旧名称。这将失败,因为不再满足约束。
问题:解决我必须迁移/更改具有外键约束的现有表的情况的预期方法是什么?
此致
博克森