node.js - 如果外键约束处于活动状态,则使用 sequelize 迁移更改表的过程
问题描述
我们在 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 会构建已更改的表并尝试删除现有的表,然后再将新表重命名为旧名称。这将失败,因为不再满足约束。
问题:解决我必须迁移/更改具有外键约束的现有表的情况的预期方法是什么?
此致
博克森
解决方案
推荐阅读
- popup - 如何根据openlayers 2中的内容调整弹出窗口的大小
- eclipse-plugin - Eclipse 运行时未激活新添加的 UI 插件
- android - 当我尝试这个我遇到错误时,有什么方法可以在不同的电脑上处理相同的 android studio 项目吗?
- npm - 如何防止下一个 npm 命令运行?
- asp.net - 是否存在不易受运行时错误影响的 app_offline.htm 的替代方案?
- android - 覆盖 onActivityResult nativescript
- php - Zend 框架在控制器中包含 php 数组
- ruby-on-rails - Rails:通过link_to 动作创建和销毁belongs_to 关联
- bash - Bash:无法从数组中删除前 3 个元素
- html - 如何仅对 mat-card 应用不透明度,而不对 mat-card 内的其余内容应用不透明度?