首页 > 解决方案 > 如果外键约束处于活动状态,则使用 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 会构建已更改的表并尝试删除现有的表,然后再将新表重命名为旧名称。这将失败,因为不再满足约束。

问题:解决我必须迁移/更改具有外键约束的现有表的情况的预期方法是什么?

此致

博克森

标签: node.jsforeign-keysmigrationsequelize.jsumzug

解决方案


推荐阅读