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

组合SQL查询中列表参数的正确传递及语法错误解决求助

解决PostgreSQL中IN子句的参数传递问题

看起来你已经走在了正确的路上——坚持用占位符避免SQL注入,但问题出在没有把参数列表传递给execute方法,以及可能对psycopg2的参数绑定机制不太熟悉。让我帮你修复这个问题:

问题根源

你的代码构造了正确的带占位符的SQL查询(SELECT * FROM ... IN (%s, %s)),但执行cur.execute(q)时没有传入my_list作为参数。数据库无法解析未绑定的占位符,因此抛出了语法错误。另外,错误信息中的?,?可能是驱动适配问题,但原生psycopg2使用%s作为占位符,我们可以通过正确的参数绑定解决。

正确实现方案

方案1:使用psycopg2.sql模块(推荐,更安全)

这个方案能确保动态生成的SQL组件(比如占位符)不会引入注入风险,尤其适合表名/列名也是动态的场景:

from psycopg2 import sql

my_list = ['name1', 'name2']
# 动态生成对应数量的占位符,并拼接进SQL语句
query = sql.SQL('SELECT * FROM MYDATABASE.MY_TABLE WHERE name IN ({})').format(
    sql.SQL(', ').join(sql.Placeholder() * len(my_list))
)

cur = self.con.cursor()
# 关键:把my_list作为第二个参数传给execute,psycopg2会自动绑定参数
cur.execute(query, my_list)
results = cur.fetchall()
cur.close()

方案2:简洁的占位符拼接(适合简单场景)

如果不需要动态处理表名/列名,也可以直接生成%s占位符列表,同样安全:

my_list = ['name1', 'name2']
# 生成与列表长度匹配的%s占位符字符串
placeholders = ', '.join(['%s'] * len(my_list))
query = f"SELECT * FROM MYDATABASE.MY_TABLE WHERE name IN ({placeholders})"

cur = self.con.cursor()
cur.execute(query, my_list)  # 同样需要传递参数列表
results = cur.fetchall()
cur.close()

为什么你的原代码出错?

  1. 你没有将my_list作为参数传递给execute,导致数据库无法识别占位符对应的实际值。
  2. 虽然你生成了filters变量,但没有使用它——这是对的,直接拼接字符串会带来SQL注入风险,坚持用占位符是正确的选择。

内容的提问来源于stack exchange,提问作者Flora Biletsiou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:16:23