gpt4 book ai didi

sequelize.js 迁移执行顺序

转载 作者:行者123 更新时间:2023-12-03 22:26:59 25 4
gpt4 key购买 nike

我有几个要在同一次迁移中执行的查询。它们是相关的,因此必须按特定顺序执行。这是我的迁移方法:

up: (queryInterface, Sequelize) =>
queryInterface.sequelize.transaction(transaction =>
Promise.all([
queryInterface.renameColumn(table, 'status', 'status_temp', { transaction }),
queryInterface.sequelize.query(
'ALTER TYPE enum_users_status RENAME TO enum_users_status_temp;',
{
transaction
}
),
queryInterface.addColumn(
table,
'isActive',
{
allowNull: false,
defaultValue: false,
type: Sequelize.BOOLEAN
},
{ transaction }
),
queryInterface.bulkUpdate(
table,
{
isActive: true
},
{
status: 'active'
},
{ transaction }
),
queryInterface.addColumn(
table,
'status',
{
allowNull: false,
defaultValue: STATUS_FREE,
type: Sequelize.ENUM(STATUS_FREE, STATUS_BUSY, STATUS_DELETED)
},
{ transaction }
),
])
),

当我执行它时,订单以一种奇怪的方式混合在一起:
Executing (591dc838-4659-4de4-b605-54b7c03c527f): START TRANSACTION;
...
Executing (591dc838-4659-4de4-b605-54b7c03c527f): ALTER TYPE enum_users_status RENAME TO enum_users_status_temp;
Executing (591dc838-4659-4de4-b605-54b7c03c527f): ALTER TABLE "public"."users" ADD COLUMN "isActive" BOOLEAN NOT NULL DEFAULT false;
Executing (591dc838-4659-4de4-b605-54b7c03c527f): UPDATE "users" SET "isActive"=true WHERE "status" = 'active'
Executing (591dc838-4659-4de4-b605-54b7c03c527f): CREATE TYPE "public"."enum_users_status" AS ENUM('free', 'busy', 'deleted');ALTER TABLE "public"."users" ADD COLUMN "status" "public"."enum_users_status" NOT NULL DEFAULT 'free';
Executing (591dc838-4659-4de4-b605-54b7c03c527f): ALTER TABLE "users" RENAME COLUMN "status" TO "status_temp";
Executing (591dc838-4659-4de4-b605-54b7c03c527f): ROLLBACK;

因为这个,我得到了错误:
ERROR: column "status" of relation "users" already exists

有没有办法让这些查询按特定顺序运行?

更新:
我的预期结果是这样的
      START TRANSACTION;
ALTER TABLE "users" RENAME COLUMN "status" TO "status_temp";
ALTER TYPE enum_users_status RENAME TO enum_users_status_temp;
ALTER TABLE "public"."users" ADD COLUMN "isNew" BOOLEAN NOT NULL DEFAULT true;
UPDATE "users" SET "isNew"=false WHERE "status_temp" = 'active';
CREATE TYPE "public"."enum_users_status" AS ENUM('free', 'busy', 'deleted');
ALTER TABLE "public"."users" ADD COLUMN "status" "public"."enum_users_status" NOT NULL DEFAULT 'free';
UPDATE "users" SET "status"='busy' WHERE "isFree" = false;
UPDATE "users" SET "status"='deleted' WHERE "status_temp" = 'deleted';
ALTER TABLE "public"."users" DROP COLUMN "isFree";
ALTER TABLE "public"."users" DROP COLUMN "status_temp";

最佳答案

发生这种情况是因为您正在使用 Promise.all 并行执行 promise 。不能保证您的 promise 会按照它们定义的顺序执行。所以你需要使用 .then 方法来执行你的工作流。

up: (queryInterface, Sequelize) =>
queryInterface.sequelize.transaction(transaction =>
queryInterface.renameColumn(table, 'status', 'status_temp', { transaction })
.then(() => queryInterface.sequelize.query(
'ALTER TYPE enum_users_status RENAME TO enum_users_status_temp;',
{
transaction
}
))
.then(...);
),

关于sequelize.js 迁移执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55279224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com