Knex 迁移失败并显示 - SAVEPOINT can only be used in transaction blocks
Knex migration fails with - SAVEPOINT can only be used in transaction blocks
我正在尝试创建 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`
为什么?
这里的问题是我没注意documentation。我知道我看过这个但是我完全忘记了。
By default, each migration is run inside a transaction.
所以在事务中创建事务会导致挑剔的行为。在这种情况下,这是双重承诺。
我正在尝试创建 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`
为什么?
这里的问题是我没注意documentation。我知道我看过这个但是我完全忘记了。
By default, each migration is run inside a transaction.
所以在事务中创建事务会导致挑剔的行为。在这种情况下,这是双重承诺。