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

pandas执行SQL WHERE IN传多整数报TypeError解决方法

问题说明

现有代码逻辑为查询quantity字段取值属于指定整数列表的记录,代码如下:

import pandas as pd

sql_query = '''
Select *
from datamart_table
where quantity in (%s)
'''
x = [10, 20, 30]
placeholders = ', '.join(i for i in x)  

SQL = sql_query%(placeholders)
df = pd.read_sql(SQL, connection)

运行时触发如下报错,要求不手动将列表中的整数转换为字符串类型实现查询:

TypeError: sequence item 0: expected str instance, int found

报错原因

str.join()方法要求传入的可迭代对象内所有元素必须为字符串类型,原代码直接将整数传入做拼接,类型不匹配触发报错。

可行解决方案

优先使用参数化查询方案,无需手动处理类型转换,同时避免SQL注入风险:

  • 利用pandas.read_sql的params参数传值,数据库驱动会自动适配字段类型,不需要手动把整数转成字符串拼入SQL语句,代码如下:
import pandas as pd

sql_query = '''
Select *
from datamart_table
where quantity in (%s)
'''
x = [10, 20, 30]
# 生成和列表长度匹配的占位符串
placeholders = ', '.join(['%s'] * len(x))
SQL = sql_query % placeholders
# 通过params传入参数,驱动自动处理类型
df = pd.read_sql(SQL, connection, params=x)

如果场景特殊必须手动拼接SQL(不推荐,存在SQL注入隐患),仅需在拼接环节将整数转为SQL可识别的数字字面量即可,该操作不会修改数据库字段类型,也不会改变查询匹配逻辑:

x = [10, 20, 30]
placeholders = ', '.join(str(i) for i in x)
SQL = sql_query % placeholders
df = pd.read_sql(SQL, connection)

注意:该方案仅适用于列表内容完全可信的内部场景,若列表内容来自外部输入,会存在严重的SQL注入风险,无特殊情况必须使用参数化查询方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:57:18