Сбой миграции Knex с - SAVEPOINT можно использовать только в блоках транзакций - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать миграцию 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 для новых - Если да, то измените их role_id на новый

Итак, я получаю

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

Почему?

1 Ответ

0 голосов
/ 30 мая 2018

Проблема заключалась в том, что я не обращал внимания на документацию . Я знаю, что видел это, но я полностью забыл.

By default, each migration is run inside a transaction.

Таким образом, создание транзакции в транзакции приведет к суетливому поведению. В этом случае это было двойным совершением.

...