【发布时间】:2019-01-18 15:22:31
【问题描述】:
我正在努力使用 pg-promise 并让它与 JSONB 一起工作。我正在使用准备好的语句,我尝试了这个 SQL 命令的两种变体(我只想用一组新的值更新 jsonb 列,基本上是附加的):
db.none({
name: 'updateLike',
text:`UPDATE posts
SET likes_by = jsonb_set(likes_by, '{$1~}', '$2~'),
likes_count = likes_count + 1
WHERE post_id = $3`,
values: [user_id, username, pid]
})
或
db.none({
name: 'updateLike',
text:`UPDATE posts
SET likes_by = likes_by || '{"$1": "$2"}',
likes_count = likes_count + 1
WHERE post_id = $3`,
values: [user_id, username, pid]
})
它给了我这样的错误:
错误:json 类型的输入语法无效
或
错误:无法确定参数 $1 的数据类型
以前有人做过吗?
【问题讨论】:
-
您不能将
$1~与Prepared Statements结合起来。前者是指pg-promise内部的查询格式化,而后者是专门针对服务器端查询格式化的,即$1~直接进入服务器,服务器无法识别。最好不要使用Prepared Statements,除非您绝对必须这样做,否则您将可以访问由pg-promise实现的所有漂亮的查询格式。这是一种妥协;) -
明白。我使用准备好的语句来避免任何 SQL 注入。但我确实读过有关使用 SQL 名称和助手的信息。所以我假设我应该改用它?
-
是的,在这种情况下,SQL Names 将同样保护您免受 SQL 注入。
-
明白,谢谢。
标签: node.js postgresql jsonb pg-promise node-postgres