删除续集迁移中的约束
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" )
我正在通过 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" )