如何将列表作为参数传入Postgres并在TypeORM中正常使用
Postgres IN子句动态传列表参数解决方案
报错核心原因:PostgreSQL 预编译语句中单个占位符仅能匹配单个参数,你在SQL中仅声明了1个占位符$1,但展开传入的fieldNames数组长度为5,数据库驱动会识别为传入了5个参数,和占位符数量不匹配就会抛出该错误。
下面是两种可行的解决方案:
方案1:使用PostgreSQL原生
ANY关键字(更推荐)
直接用= ANY($1)替代IN ($1),不需要展开数组,直接把整个数组作为单个参数传入即可,语法简洁性能也无损耗:const fields = await queryRunner.query( `SELECT "fieldId", "name" FROM "field" WHERE "name" = ANY($1)`, [fieldNames] // 直接传入整个数组,不需要展开 );方案2:动态生成占位符(通用SQL兼容方案)
先根据传入列表的长度生成对应数量的占位符,再传入展开的参数,兼容所有支持预编译的关系型数据库:// 按数组长度生成对应占位符,如长度为5则生成 $1,$2,$3,$4,$5 const placeholders = fieldNames.map((_, index) => `$${index + 1}`).join(','); const fields = await queryRunner.query( `SELECT "fieldId", "name" FROM "field" WHERE "name" IN (${placeholders})`, [...fieldNames] );
注意:两种方案都走预编译逻辑,不存在SQL注入风险,请勿直接把列表内容拼接进SQL字符串,避免注入漏洞。
内容的提问来源于stack exchange,提问作者sf8193
相关产品推荐
相关产品推荐

