PG-Promise传递数组作为参数仅返回一条结果的问题排查
如何正确向SELECT查询传递数组参数实现IN匹配
问题核心
你当前用字符串拼接join的方式虽然能实现需求,但存在严重的SQL注入风险,不建议继续使用。你尝试的:list/:csv修饰符无效,问题出在参数传递的方式错误。
正确的参数化实现(以pg-promise为例)
从你使用的:list/:csv语法判断,你应该在用pg-promise库。正确的做法是把数组作为单个参数传入查询方法的参数列表(外层包裹一个数组):
var values = ['WH12345678','WH22345678']; // 使用:list修饰符自动处理数组格式 var query = "select * from pups where workorder IN ($1:list)"; // 关键:将values作为单个元素放入参数数组 db.any(query, [values]) .then(data => { // 处理查询结果 }) .catch(err => { // 处理错误 });
也可以用:csv修饰符,效果一致:
var query = "select * from pups where workorder IN ($1:csv)"; db.any(query, [values]);
之前写法失败的原因
你直接调用db.any(query, values)时,数组的每个元素会被当作独立的查询参数(对应$1、$2),但:list/:csv修饰符需要的是单个参数对应的完整数组,最终导致查询只匹配了数组的第一个元素。
为什么要放弃join拼接?
手动拼接字符串完全没有SQL注入防护,如果values中包含恶意内容(比如'); DROP TABLE pups;--),会直接执行破坏性操作。参数化查询会自动处理字符串转义,从根源避免这类风险。
内容的提问来源于stack exchange,提问作者FreeSoftwareServers
相关产品推荐
相关产品推荐

