JavaScript (Postgres DB) - 如何在 WHERE IN ( ) 子句中使用带有数组作为参数的准备好的语句

Aza*_*ria 5 javascript postgresql node.js pg-promise

我目前正在使用http://vitaly-t.github.io/pg-promise/Database.html中的数据库类,并尝试在 Postgres DB 上使用PreparedStatment 实现 Update 语句,同时将数组传递到 WHERE IN条款?

const updatePreparedStatment = new PS('prepared-statement', 'UPDATE mytable SET "MESSAGE"=$1 WHERE "ID" IN ($2)', ["dummy update", ["1","2","3"]]);
Run Code Online (Sandbox Code Playgroud)

小智 5

它在node-postgres的常见问题解答中进行了描述https://github.com/brianc/node-postgres/wiki/FAQ#11-how-do-i-build-a-where-foo-in--query-to -查找与值数组匹配的行

如何构建 WHERE foo IN (...) 查询来查找与值数组匹配的行?node-postgres 支持将简单的 JavaScript 数组映射到 PostgreSQL 数组,因此在大多数情况下,您可以像传递任何其他参数一样传递它。

client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);
Run Code Online (Sandbox Code Playgroud)

请注意, = 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'], ...);
Run Code Online (Sandbox Code Playgroud)

...但是当 = ANY 与 JavaScript 数组一起使用时几乎没有什么好处。

如果您使用的是旧版本的node-postgres,或者您需要创建node-postgres无法处理的更复杂的PostgreSQL数组(复合类型的数组等),您可以使用动态SQL生成数组文字,但是执行此操作时要格外小心 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, ...);
Run Code Online (Sandbox Code Playgroud)

希望有帮助,因为谷歌找不到这个