删除续集迁移中的约束

时间:2015-04-08 15:21:39

标签: javascript sql constraints sequelize.js

我通过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

3 个答案:

答案 0 :(得分:23)

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

queryInterface.removeConstraint(tableName, constraintName)

文档为here

答案 1 :(得分:5)

如果要删除索引,请使用:

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

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

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

答案 2 :(得分:4)

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

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

其中users是我的表名,而users_userId_key是索引或约束名,如果您要删除(例如)有唯一约束,则其格式通常为attributename_unique_key