删除续集迁移中的约束

soe*_*ace 11 javascript sql constraints sequelize.js

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

添加约束有效,但由于您需要提供"向后迁移",因此以相同方式删除它不会.向后迁移时不会出现任何错误,但会再次应用向前迁移结果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);
  }
};
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用removeIndex

migration.removeIndex('Users', 'myAttribute_unique_idx').done(done);
Run Code Online (Sandbox Code Playgroud)

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

Possibly unhandled SequelizeDatabaseError: cannot drop index "myAttribute_unique_idx" because constraint myAttribute_unique_idx on table "Users" requires it
Run Code Online (Sandbox Code Playgroud)

Tim*_*ois 26

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

queryInterface.removeConstraint(tableName, constraintName)

文档在这里.


ezp*_*zpn 15

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

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

  return;
}
Run Code Online (Sandbox Code Playgroud)


kes*_*wal 6

removeConstraint()如果要删除约束,则Sequelize有方法。因此,您可以使用以下内容:

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

这里users是我的表名,users_userId_key是索引或约束名称,attributename_unique_key如果您要删除(例如说)有唯一的约束,则通常采用这种形式。


小智 5

如果要删除索引,则应使用:

down: function (migration, DataTypes) {
    return migration.removeIndex('Users', 'myAttribute_unique_idx');
}
Run Code Online (Sandbox Code Playgroud)

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

如下所述,自己处理索引的创建也是一件好事:http: //sequelize.readthedocs.org/en/latest/docs/migrations/#addindextablename-attributes-options