删除续集迁移中的约束

Remove constraints in sequelize migration

我正在通过 migrations.changeColumn 函数在迁移中添加 unique 约束。

添加约束有效,但由于您需要提供“向后迁移”,因此以相同的方式删除它无效。向后迁移时它不会给出任何错误,但再次应用前向迁移会导致 Possibly unhandled SequelizeDatabaseError: relation "myAttribute_unique_idx" already exists.

(使用的数据库是postgres)

module.exports = {
  up: function (migration, DataTypes, done) {
    migration.changeColumn(
      'Users',
      'myAttribute',
      {
        type: DataTypes.STRING,
        unique: true                 // ADDING constraint works
      }
    ).done(done);
  },

  down: function (migration, DataTypes, done) {
    migration.changeColumn(
      'Users',
      'myAttribute',
      {
        type: DataTypes.STRING,
        unique: false                // REMOVING does not
      }
    ).done(done);
  }
};

我也试过用removeIndex

migration.removeIndex('Users', 'myAttribute_unique_idx').done(done);

但是在还原迁移时出现以下错误:

Possibly unhandled SequelizeDatabaseError: cannot drop index "myAttribute_unique_idx" because constraint myAttribute_unique_idx on table "Users" requires it

如果你想删除你应该使用的索引:

down: function (migration, DataTypes) {
    return migration.removeIndex('Users', 'myAttribute_unique_idx');
}

return 用于使用 promise 样式而不是回调。这是sequelize推荐的

您也可以按照此处所述自行处理索引的创建: http://sequelize.readthedocs.org/en/latest/docs/migrations/#addindextablename-attributes-options

不幸的是,sequelize 没有内置的迁移方法来删除约束。这就是为什么在删除密钥之前您需要进行原始查询。

down: function (migration, DataTypes) {
  migration.sequelize.query(
    'ALTER TABLE Users DROP CONSTRAINT myAttribute_unique_idx;'
  );
  migration.removeIndex('Users', 'myAttribute_unique_idx');

  return;
}

截至 2017 年使用 Sequelize 4.4.2,我们可以使用 queryInterface API:

移除约束

queryInterface.removeConstraint(tableName, constraintName)

文档是 here

如果您想删除约束,Sequelize 有 removeConstraint() 方法。 所以你可以使用这样的东西:

return queryInterface.removeConstraint('users', 'users_userId_key', {})

其中 users 是我的 Table 名称,users_userId_key 是索引或约束名称,如果您有要删除的唯一约束,通常采用 attributename_unique_key 形式(说)。

只需简单地这样做:

 await queryInterface.removeConstraint("Users","myAttribute" )