如何在 Postgresql 的事务中执行 If-Else 条件
How to do an If-Else Condition inside a Transaction in Postgresql
我已经在 Postgresql 中编写了一个事务块(通过 node-postgres)并且它工作正常,尽管我想问一下是否有可能(以及如何)在事务块中放置一个 if-else 条件。
这是我当前的代码(按预期工作):
async function execute() {
// Promise chain for pg Pool client
const client = await pool
.connect()
.catch(err => {
console.log("\nclient.connect():", err.name);
process.exit();
});
//Initiate the Postgres transaction
await client.query("BEGIN");
try {
... <<constant declarations>>
// Pass SQL string to the query() method
await client.query(sqlString, sqlValues, function(err, result) {
<< Insert If-Else Condition 1 Here >>
<< Insert If-Else Condition 2 Here >>
if (someCondition == 1) {
// Rollback before executing another transaction
client.query("ROLLBACK");
} else if (err) {
client.query("ROLLBACK");
res.status(500).send("Server Error");
} else {
client.query("COMMIT");
res.json({ "message": "done!" });
}
});
} catch (er) {
// Rollback before executing another transaction
client.query("ROLLBACK");
}
} finally {
client.release();
}
execute();
上面的代码是有效的,虽然我想在事务中放置两个 if-else 条件块,如果条件满足,它将触发 2 个查询,如果是真或假,将继续 if (someCondition == 1)
条件块。
这是我要放置的两个 if-else 条件:
if (conditionA == true) {
await pool.query(query1)
}
if (conditionB == true) {
await pool.query(query2)
}
运行 它们会导致错误:
SyntaxError: await is only valid in async function
,原点在 await pool.query(query1)
。
删除 await
导致未解决的承诺错误。
我对如何完成这部分感到困惑。我一直在通过保存点修改嵌套事务,但无济于事。
在此先感谢您!
"await is only valid in async function"
你的代码在异步函数中?
async function execute() {
但是……其实不是,就在这里面
await client.query(sqlString, sqlValues, function(err, result) {
^
here is the function---------------------^
...并且此函数不是异步的,这解释了错误消息。
我想知道你为什么在 client.query 中使用回调并同时进行异步,因为异步的全部意义在于避免那些邪恶的回调。这是疏忽吗?如果您添加“异步”,它甚至可以工作吗?或者也许是因为我从未使用过 node.js 所以我不知道我在说什么。
注:
if (someCondition == 1) {
// Rollback before executing another transaction
client.query("ROLLBACK");
我不知道这个回滚在做什么...
我已经在 Postgresql 中编写了一个事务块(通过 node-postgres)并且它工作正常,尽管我想问一下是否有可能(以及如何)在事务块中放置一个 if-else 条件。
这是我当前的代码(按预期工作):
async function execute() {
// Promise chain for pg Pool client
const client = await pool
.connect()
.catch(err => {
console.log("\nclient.connect():", err.name);
process.exit();
});
//Initiate the Postgres transaction
await client.query("BEGIN");
try {
... <<constant declarations>>
// Pass SQL string to the query() method
await client.query(sqlString, sqlValues, function(err, result) {
<< Insert If-Else Condition 1 Here >>
<< Insert If-Else Condition 2 Here >>
if (someCondition == 1) {
// Rollback before executing another transaction
client.query("ROLLBACK");
} else if (err) {
client.query("ROLLBACK");
res.status(500).send("Server Error");
} else {
client.query("COMMIT");
res.json({ "message": "done!" });
}
});
} catch (er) {
// Rollback before executing another transaction
client.query("ROLLBACK");
}
} finally {
client.release();
}
execute();
上面的代码是有效的,虽然我想在事务中放置两个 if-else 条件块,如果条件满足,它将触发 2 个查询,如果是真或假,将继续 if (someCondition == 1)
条件块。
这是我要放置的两个 if-else 条件:
if (conditionA == true) {
await pool.query(query1)
}
if (conditionB == true) {
await pool.query(query2)
}
运行 它们会导致错误:
SyntaxError: await is only valid in async function
,原点在 await pool.query(query1)
。
删除 await
导致未解决的承诺错误。
我对如何完成这部分感到困惑。我一直在通过保存点修改嵌套事务,但无济于事。
在此先感谢您!
"await is only valid in async function"
你的代码在异步函数中?
async function execute() {
但是……其实不是,就在这里面
await client.query(sqlString, sqlValues, function(err, result) {
^
here is the function---------------------^
...并且此函数不是异步的,这解释了错误消息。
我想知道你为什么在 client.query 中使用回调并同时进行异步,因为异步的全部意义在于避免那些邪恶的回调。这是疏忽吗?如果您添加“异步”,它甚至可以工作吗?或者也许是因为我从未使用过 node.js 所以我不知道我在说什么。
注:
if (someCondition == 1) {
// Rollback before executing another transaction
client.query("ROLLBACK");
我不知道这个回滚在做什么...