我想使用 Sequelize 创建迁移,以使用 CamelCase 重命名列,从而拥有一个包含 Snake_case 列的数据库。
我使用 Sequelize 创建迁移并使用迁移。
module.exports = {
up: function(queryInterface, Sequelize) {
return queryInterface.renameColumn('my_some_table', 'totoId', 'toto_id');
},
down: function(queryInterface, Sequelize) {
//
}
};
但是...我对此列 (totoId) 和名称列有一个唯一约束,名为 my_some_table_name_totoId_uindex,并且我在此列 (totoId) 上也有一个索引。
如何强制重命名具有唯一约束和一个索引的列?
最佳答案
您必须删除所有约束,重命名该列,然后重新添加约束。通过对 totoId
进行单一约束,它看起来像这样:
// 1) drop constraint
queryInterface.removeConstraint('my_some_table', 'my_constraint');
// 2) rename column
queryInterface.renameColumn('my_some_table', 'totoId', 'toto_id');
// 3) add constraint back
queryInterface.addConstraint('my_some_table', ['toto_id'], {
type: 'unique',
name: 'my_constraint'
});
请记住,迁移应该是原子操作。 因此您应该按该顺序创建 3 个迁移。 或者甚至更好,正如@Santilli 在评论中指出的那样,您可以创建一个事务。
如果其中一个查询失败,这将防止应用任何更改:
return queryInterface.sequelize.transaction(async (transaction) => {
await queryInterface.removeConstraint("my_some_table", "my_constraint", {
transaction,
});
await queryInterface.renameColumn("my_some_table", "totoId", "toto_id", {
transaction,
});
await queryInterface.addConstraint("my_some_table", ["toto_id"], {
type: "unique",
name: "my_constraint",
transaction,
});
});
此外,请记住创建一个事务来恢复 down
函数中的更改。
关于migration - Sequelize - 使用索引和约束重命名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47755293/