我正在尝试创建一个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`
为什么?
答案 0 :(得分:0)
这里的问题是我没有注意documentation。我知道我见过这个,但我完全忘了。
https://callerapp.com/check?result=xxxx
因此,在事务中创建事务将导致繁琐的行为。在这种情况下,这是双重提交。