【问题标题】:How to use JSONB operations with pg-promise如何通过 pg-promise 使用 JSONB 操作
【发布时间】: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


【解决方案1】:

这就是我最终做的:

  db.none(`UPDATE posts
           SET likes_by = likes_by || '{$1~: $2~}',
           likes_count = likes_count + 1
           WHERE post_id = $3#`,
           [user_id, username, pid]
  )

有效。谢谢!

【讨论】:

  • 我怀疑带有$3# 的部分不是你应该使用的。在这种情况下,它应该被正确转义,默认情况下,或者根本不被转义,即Raw Text
  • 我一定误解了 :value 的作用。我将使用 :raw 代替,我只是想在该特定占位符中使用提供的整数值。感谢您指出。
  • 如果你传入一个整数,那么你根本不需要任何过滤器,只需要普通的$3就足够了。
猜你喜欢
  • 2020-03-04
  • 2017-04-03
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多