You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将列表作为参数传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:15:05