我正在尝试执行这样的查询:
SELECT * FROM table WHERE id IN (1,2,3,4)
问题是我要过滤的ID列表不是恒定的,并且每次执行时都必须不同。我还需要转义这些id,因为它们可能来自不受信任的来源,尽管我实际上将转义查询中的所有内容,而不管该来源的可信度如何。
节点的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 ]),因为似乎对数组参数没有任何特殊处理。
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一起使用。
IN (values)
如果有人以比我上面列出的方法更优雅的方式解决了这个问题,或者如果我真的缺少有关node-postgres的知识,请提供帮助。
我们之前在github问题列表上已经看到了这个问题。正确的方法是根据数组动态生成参数列表。像这样:
var arr = [1, 2, "hello"]; var params = []; for(var i = 1; i <= arr.length; i++) { params.push('$' + i); } var queryText = 'SELECT id FROM my_table WHERE something IN (' + params.join(',') + ')'; client.query(queryText, arr, function(err, cb) { ... });
这样,您就可以将postgres参数化转义。