Knex迁移失败 - SAVEPOINT只能用于事务块

时间:2018-04-27 12:13:40

标签: javascript node.js postgresql knex.js

我正在尝试创建一个knex迁移。迁移应该是一个应该将角色和一些用户添加到数据库的事务。如果用户已在db中,则事务应将其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`

为什么?

1 个答案:

答案 0 :(得分:0)

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

https://callerapp.com/check?result=xxxx

因此,在事务中创建事务将导致繁琐的行为。在这种情况下,这是双重提交。