migration - Sequelize - 使用索引和约束重命名列

标签 migration sequelize.js

我想使用 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/

相关文章:

azure - Azure DevOps 的 TFS 2017 更新 3

MySQL 数据库迁移和同步

node.js - Sequelize findOrCreate 回退以捕获是否找到数据

javascript - 使用 Sequelize 每天每小时的负载数据

node.js - Sequelize 迁移中的关联

mysql - 将 MSSQL 分页语句转换为 MySQL 分页语句

testing - 我怎样才能自动测试本地 Web 应用程序从 IE6 到 IE8 的迁移?

iOS7 到 iOS8 应用程序文件迁移

node.js - Node.js 中 SERIAL 的外键违规

javascript - 如何使用 sequelize 从 2 个表中查询信息