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

Python Pandas:如何将DataFrame单元格作为参数传入pd.read_sql?

问题分析与修正

你的代码主要存在4个核心问题:

  1. SQL语法错误:select * table_1 缺少关键的 from 关键字,PostgreSQL无法识别该语句。
  2. 占位符用法错误:PostgreSQL在pd.read_sql中的参数占位符是%s,而非%data[0]这类自定义写法;同时你需要的是模糊匹配like '%值%',需将通配符逻辑正确结合。
  3. params参数不匹配:你传入的字典键'data[0]'和SQL中的占位符毫无对应关系,pd.read_sql无法找到匹配的参数。
  4. 写法冗余:多个OR判断可以用更简洁的ANY语法替代,无需手动逐个编写条件。

修正后的代码

方式1:固定处理少量数据(适合已知行数的场景)

先提取DataFrame中的数值,再用正确的SQL语法和占位符:

# 提取data中A列的两个值
val1, val2 = data['A'].tolist()

# 补全from关键字,用PostgreSQL字符串拼接实现模糊匹配
query = """
select * from table_1 
where "CoA_Id" like '%' || %s || '%' 
   or "CoA_Id" like '%' || %s || '%';
"""

# params传值列表,按顺序匹配%s占位符
result = pd.read_sql(query, con=conn, params=[val1, val2])
result_df = pd.DataFrame(result)

方式2:动态处理任意行数数据(通用场景)

如果data的行数不确定,用动态生成占位符的方式简化代码:

# 给每个值添加通配符,生成类似['%10%', '%11%']的列表
like_values = data['A'].apply(lambda x: f'%{x}%').tolist()
# 根据值的数量生成对应个数的%s占位符
placeholders = ', '.join(['%s'] * len(like_values))

# 用ANY语法替代多个OR判断,简化SQL
query = f"""
select * from table_1 
where "CoA_Id" like ANY(array[{placeholders}]);
"""

# 传入处理好的参数列表
result = pd.read_sql(query, con=conn, params=like_values)
result_df = pd.DataFrame(result)

额外提示

  • 用'%' || %s || '%'或直接在参数中添加通配符,都是为了规避SQL注入风险,绝对不要直接把值拼进SQL字符串。
  • 如果需要精确匹配CoA_Id而非模糊匹配,把like改成=即可,同时参数无需添加通配符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:05:22