目前,我正在使用http://vitaly-t.github.io/pg-promise/Database.html中的数据库类,并试图在Postgres上使用PreparedStatment实现一个更新语句,同时将一个数组传递给WHERE子句。
const updatePreparedStatment = new PS('prepared-statement', 'UPDATE mytable SET "MESSAGE"=$1 WHERE "ID" IN ($2)', ["dummy update", ["1","2","3"]]);发布于 2018-11-14 08:40:31
它是用节点-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how-do-i-build-a-where-foo-in--query-to-find-rows-matching-an-array-of-values的常见问题描述的。
如何构建WHERE foo IN (.)查询以查找与值数组匹配的行?节点-postgres支持将简单的JavaScript数组映射到PostgreSQL数组,因此在大多数情况下,您可以像传递任何其他参数一样传递它。
client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);请注意,= ANY是另一种写入IN (.)的方法,但与IN (.)不同当您将数组作为查询参数传递时,它将如何工作。
如果预先知道数组的长度,可以将其压缩为in列表:
// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);..。但是,当=使用JavaScript数组时没有什么好处。
如果您使用的是节点-postgres的旧版本,或者需要创建节点-postgres没有处理的更复杂的PostgreSQL数组(组合类型数组,等等),则可以使用动态SQL生成数组文本,但在这样做时要非常小心。以下方法是安全的,因为它生成带有查询参数的查询字符串和扁平的参数列表,因此仍然使用驱动程序对参数化查询(“准备好的语句”)的支持来防止SQL注入:
var stooge_names = ['larry', 'curly', 'moe'];
var offset = 1;
var placeholders = stooge_names.map(function(name,i) {
return '$'+(i+offset);
}).join(',');
client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);希望这能帮上忙,因为谷歌找不到这个
https://stackoverflow.com/questions/53280333
复制相似问题