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
2017年のSequelize4.4.2では、queryInterfaceAPIを使用して制約を削除できます。
queryInterface.removeConstraint(tableName, constraintName)
ドキュメントは ここ です。
残念ながら、sequelizeには、制約を削除するための組み込みの移行メソッドがありません。そのため、キーを削除する前に、生のクエリを作成する必要があります。
down: function (migration, DataTypes) {
migration.sequelize.query(
'ALTER TABLE Users DROP CONSTRAINT myAttribute_unique_idx;'
);
migration.removeIndex('Users', 'myAttribute_unique_idx');
return;
}
インデックスを削除する場合は、次を使用する必要があります。
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にはremoveConstraint()
メソッドがあります。したがって、次のようなものを使用できます。
return queryInterface.removeConstraint('users', 'users_userId_key', {})
ここで、users
は私のテーブル名であり、users_userId_key
はインデックスまたは制約名であり、削除したい一意の制約がある場合は通常attributename_unique_key
の形式になります(たとえば)。