【发布时间】:2021-11-07 20:49:56
【问题描述】:
我正在尝试执行这样的查询:
SELECT * FROM table WHERE id IN (1,2,3,4)
问题是我要过滤的 id 列表不是恒定的,每次执行时都需要不同。我还需要转义 id,因为它们可能来自不受信任的来源,尽管无论来源的可信度如何,我实际上都会转义查询中的任何内容。
node-postgres 似乎只使用绑定参数:client.query('SELECT * FROM table WHERE id = $1', [ id ]);如果我有已知数量的值 (client.query('SELECT * FROM table WHERE id IN ($1, $2, $3)', [ id1, id2, id3 ])),这将起作用,但不能直接使用数组:client.query('SELECT * FROM table WHERE id IN ($1)', [ arrayOfIds ]),因为似乎没有对数组参数进行任何特殊处理。
根据数组中的项目数动态构建查询模板并将ids数组扩展为查询参数数组(在我的实际情况下,它还包含除id列表之外的其他参数)似乎是不合理的负担。在查询模板中硬编码 id 列表似乎也不可行,因为 node-postgres 不提供任何值转义方法。
这似乎是一个非常常见的用例,所以我的猜测是我实际上忽略了一些东西,而不是不可能将常见的IN (values) SQL 运算符与 node-postgres 一起使用。
如果有人比上面列出的问题更优雅地解决了这个问题,或者我真的缺少有关节点孔的问题,请帮助。
【问题讨论】:
-
我自己没有尝试过,但您似乎希望将嵌套数组作为替换数组的第一个(在本例中是唯一的)元素传递,因为它期望每个元素该参数是替代值。示例:client.query('SELECT * FROM table WHERE id IN ($1)', [[arrayOfIds]]);
-
不,那样不行(可以预见)。显然,它试图将数组[1,2,3]表示为字符串值“ 1,2,3”,并且服务器返回一个错误“无效输入语法”。
-
您可以发布它在以这种方式传递数组时尝试执行的完整查询吗?我对 Posgres 不像 MySQL 那样熟悉,但这不是您表示该查询的方式吗? IN (1,2,3) 在我看来是正确的。除非我完全误解了你想要做什么。
-
我看不到任何捕获完整查询的方法,因为实际的网络协议消息将查询模板和参数列表分别传递给 postgres 服务器,并且任何最终组合都发生在服务器端。即使在 postgres 日志中,也没有完整的查询:
2012-05-26 20:31:08 EEST ERROR: invalid input syntax for integer: "1,3" 2012-05-26 20:31:08 EEST STATEMENT: SELECT * FROM users WHERE id IN ($1)
标签: node.js node-postgres