【问题标题】:Knex migration fails with - SAVEPOINT can only be used in transaction blocksKnex 迁移失败 - SAVEPOINT 只能在事务块中使用
【发布时间】:2018-05-31 03:16:26
【问题描述】:

我正在尝试创建 knex 迁移。迁移应该是一个事务,应该将角色和一些用户添加到数据库。如果用户已经在数据库中,则事务应该将他们的 role_id 更改为新的 role_id

exports.up = function(knex) {
  async function transaction(t) {

    await t.raw('INSERT INTO "public"."role" VALUES (3, \'external_support\');');

    let i;

    for(i = 0; i < newUsers.length; i += 1) {

      const result = await t.raw('SELECT id FROM "public"."user" WHERE email = ?;', [
        newUsers[i].email
      ]);

      if (result.rowCount === 0) {
        await t.raw('INSERT INTO "public"."user" (email, first_name, last_name) VALUES (?, ?, ?);', [
          newUsers[i].email,
          newUsers[i].firstname,
          newUsers[i].lastname
        ]);
        await t.raw('INSERT INTO "public"."users_roles" VALUES ((SELECT id FROM "public"."user" WHERE email = ?) , 3);', [
          newUsers[i].email
        ]);
      } else {
         await t.raw('UPDATE "public"."users_roles" SET role_id = 3 WHERE user_id = (SELECT id FROM "public"."user" WHERE email = ?);', [
          newUsers[i].email
        ]);
      }
    }
  }

所以这背后的基本逻辑是(应该是) - 添加新角色 - 检查用户是否存在 - 如果不添加用户并将他们的 role_id 设置为 new - 如果是,则将他们的 role_id 更改为新的

所以,我得到的是

`error: SAVEPOINT can only be used in transaction blocks`

为什么?

【问题讨论】:

  • Knex 为您的迁移创建隐式事务,因此这可能与保存点错误有关(嵌套事务是保存点)。另一件事是您的代码没有意义。您只是在 module.export.up 中创建了一个异步函数,然后甚至没有调用它。所以基本上你正在运行一个空迁移。
  • 不不,有return knex.transaction(transaction);,但我没有在这里写。 module.export.up 在我输入 knex migrate:latest 时被调用
  • 也许您应该编辑您的问题以获得正确的代码?但是也许您的代码在调用该事务之前会引发错误,这可能会导致事务中的隐式回滚,然后 knex 不会注意到事务已损坏并尝试创建保存点以创建内部事务。不看实际代码不可能知道。

标签: javascript node.js postgresql knex.js


【解决方案1】:

这里的问题是我没有关注documentation。我知道我看过这个,但我完全忘记了。

By default, each migration is run inside a transaction.

所以在事务中创建事务会导致挑剔的行为。在这种情况下,这是双重承诺。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2020-04-23
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2021-08-10
    • 2017-09-04
    • 2022-06-22
    • 2019-08-12
    相关资源
    最近更新 更多