如何在节点发布中构建 IF 语句?



我正在尝试在我的node-postgres事务中编写以下 IF 语句。这是为了使查询更加可靠,方法是在单独的表中插入和更新之前检查字段的布尔值以获取唯一 ID。

DO $$
BEGIN 
IF (SELECT has_submitted FROM schema1.analysis_sent WHERE unique_link = 'aaa') THEN
RAISE EXCEPTION 'Already submitted questions.';
ELSE
INSERT INTO schema1.question_breakdown (question_id) VALUES (1);
UPDATE schema1.analysis_sent SET has_submitted = TRUE WHERE unique_link = 'aaa';
RAISE NOTICE 'Added to question_breakdown and updated has_submitted field.';
END IF;
END $$;

如何在 node.js 中构建它,特别是使用 node-postgres 包?目前,它看起来像下面,我想用上面的 IF 语句替换底部的两个查询(saveQueryupdateQuery(。

我在 IF 语句的BEGIN/END语法和我通常在node-postgres中使用的事务的BEGIN/COMMIT/ROLLBACK语法之间感到困惑。我只是将前者放入后一个块吗?

const saveQuery = format('INSERT INTO %I.question_breakdown_result(question_id, student_id, marks_scored) VALUES %L', org, questions);
const updateQuery = format('UPDATE %I.analysis_sent SET has_submitted = TRUE WHERE unique_link = %L', org, link.uniqueLink);
(async() => {
const client = await pool.connect();
try {
await client.query('BEGIN');
await client.query(saveQuery);
await client.query(updateQuery);
await client.query('COMMIT');
return res.status(201).json(helper.setResponsePayload(true, 'Your results have been saved and submitted.', null));
} catch (err) {
await client.query('ROLLBACK');
res.status(200).json(helper.setResponsePayload(false, 'Failed Database Query: Save Question Result.', null));
throw err;
} finally {
client.release();
}
})().catch(err => console.log(err.stack))

第二个问题 - 上面的 IF 语句是否被视为事务,即如果查询的一部分失败,整个事情就会失败?谢谢。

经过一些尝试和错误,我在这个澄清帖子的很多帮助下提出了以下解决方案。

上面的IF语句是否被视为交易,即如果一部分 的查询失败,整个事情失败了?谢谢。

答案是否定的 - 与事务BEGIN相比,IF 语句的BEGIN不同。有了这些知识,我认为可以在BEGIN/COMMIT/ROLLBACK块中插入"IF"BEGIN/END语句,现在可以回答以下问题:

如何在我的节点.js代码中构建它?

const checkQuery = format('SELECT has_submitted FROM %I.analysis_sent WHERE unique_link = %L', org, link.uniqueLink);
const saveQuery = format('INSERT INTO %I.question_breakdown_result(question_id, student_id, marks_scored) VALUES %L', org, questions);
const updateQuery = format('UPDATE %I.analysis_sent SET has_submitted = TRUE WHERE unique_link = %L', org, link.uniqueLink);
const ifQuery = `
DO $$
BEGIN 
IF (${checkQuery}) THEN
RAISE EXCEPTION 'User has already submitted paper questions.';
ELSE
${saveQuery};
${updateQuery};
RAISE NOTICE 'Added to question_breakdown and updated has_submitted field.';
END IF;
END $$;
`;
(async() => {
const client = await pool.connect();
try {
await client.query('BEGIN');
await client.query(ifQuery);
await client.query('COMMIT');
} catch (err) {
await client.query('ROLLBACK');
throw err;
} finally {
client.release();
}
})().catch(err => console.log(err.stack));

现在它按计划工作:检查是否TRUE唯一 ID 的字段;如果FALSE,则执行insertupdate语句。如果insert/update语句失败,则整个事务失败。

最新更新