web-dev-qa-db-ja.com

移行の続編の制約を削除する

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
12
soerface

2017年のSequelize4.4.2では、queryInterfaceAPIを使用して制約を削除できます。

queryInterface.removeConstraint(tableName, constraintName)

ドキュメントは ここ です。

18
Tim Givois

残念ながら、sequelizeには、制約を削除するための組み込みの移行メソッドがありません。そのため、キーを削除する前に、生のクエリを作成する必要があります。

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

  return;
}
14
ezpn

インデックスを削除する場合は、次を使用する必要があります。

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

5
bragi

制約を削除する場合、SequelizeにはremoveConstraint()メソッドがあります。したがって、次のようなものを使用できます。

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

ここで、usersは私のテーブル名であり、users_userId_keyはインデックスまたは制約名であり、削除したい一意の制約がある場合は通常attributename_unique_keyの形式になります(たとえば)。

1
keshav Aggarwal