【问题标题】:bind message supplies 2 parameters, but prepared statement "" requires 1绑定消息提供 2 个参数,但准备好的语句“”需要 1 个
【发布时间】:2020-12-10 05:59:14
【问题描述】:
  • 我正在使用 pg-promise 执行以下查询

这是原始查询变量

const query = `SELECT * FROM feed_items WHERE feed_item_id=$1 AND '{$2}' <@ tags`
  • tags 是一个数组,我想检查数组中是否存在项
  • 我不断收到此错误绑定消息提供 2 个参数,但准备好的语句“”尽管提供了 2 个值,但仍需要 1 个 有人可以建议我哪里出错了

【问题讨论】:

  • '{$2}' 被认为只是文本,而不是变量,因为您将它放在引号中。因此出现错误。
  • '{sometag}'
  • Prepared Statements 不会让你这样做,它们太有限了。但是pg-promise 原生格式可以做任何事情。例如,使用filters:'{$2#}''{$2:value}' 只是一种可能的方法。
  • 非常感谢!跟着这里vitaly-t.github.io/pg-promise/formatting.html#.value,它的工作原理!真是太棒了

标签: pg-promise


【解决方案1】:

Prepared Statements 不会让你这样做,因为它太有限了。但是pg-promise 原生格式非常灵活,您可以通过多种方式来实现...

const wrap = a => ({rawType: true, toPostgres: () => pgp.as.format('{$1#}', [a])});

或者像这样:

const wrap = a => ({rawType: true, toPostgres: () => pgp.as.format('{$1:value}', [a])});

甚至像这样:

const wrap = a => ({rawType: true, toPostgres: () => `'{${pgp.as.value(a)}}'`});

示例:*

await db.any('SELECT ... $1 <@ tags', [wrap(123)]);
//=> SELECT ... '{123}' <@tags'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2015-06-23
    • 2017-05-14
    • 1970-01-01
    • 2013-08-09
    • 2021-08-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多