我正在尝试使用快速服务器上的pg-promise使用AJAX请求更新我的数据库。
到目前为止一切正常,但现在我想使用CTE(WITH)更新两个表,这也是有效的。我现在要做的是能够拥有动态列,具体取决于PUT请求。
澄清:
请求
{
"dob": "01.01.1970",
"email": "example@example.com",
"street": "street 1",
}
请求
{
"dob": "01.01.1970",
"email": "example@example.com",
"phone": "0000",
"tag": "blue",
}
我尝试了以下内容并且它正在运行,但我的问题是:
QueryFile.sql
WITH update_table_one AS (
UPDATE table_one SET username=${username}
WHERE identification_number=${identification_number}
RETURNING identification_number
)
UPDATE table_two SET ${fromSet:raw}
WHERE identification_number=(SELECT identification_number FROM update_table_one);
Server.js
let qf = // ...QueryFile
let helpers = pgp.helpers;
let user = req.params.user;
let body = req.body;
let dbBody = {
username: user,
identification_number: 'ABC123',
fromSet: helpers.sets(body)
};
db.oneOrNone(qf, dbBody)
.then(data => {
res.json({ success: true, message: 'Yes!' });
})
.catch(error => {
res.json({ success: false, message: 'No!' });
});
除了最初的问题(与评论中的问题有关):
{
"dob": "01.01.1970",
"email": "example@example.com",
"street": "street 1",
"phone": "0000",
"tag": "blue",
"group": "students",
"password": "hash",
"track": "one",
}
答案 0 :(得分:0)
我正确使用pg-promise吗?
几乎。您的查询没有返回任何内容,因此使用方法oneOrNone在逻辑上是不正确的,而应该是none。
这种方法仍然是SQL注入安全(:raw)吗?
是的,因为即使您正在注入原始设置,这些列也会根据其JavaScript类型自动在helpers内进行预转义,因此任何注入尝试都会在那里被挫败。
有没有更好的方法来获得相同的结果?
只有事先了解了所有列,才能将它们预先声明为ColumnSet,以获得更好的性能和/或类型转换。但除此之外,没有。
另请注意,如果您呼叫UPDATE
没有列传入,则会返回一个空字符串per the API,这将导致无效的[
。