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

时间:2018-11-13 11:44:24

标签: javascript node.js postgresql pg-promise

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

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

1 个答案:

答案 0 :(得分:0)

在node-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的FAQ中进行了描述

如何构建WHERE foo IN(...)查询以查找与值数组匹配的行? node-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'], ...);

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

如果您使用的是旧版本的node-postgres,或者您需要创建node-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, ...);

希望如此,因为Google找不到它