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
相关产品推荐
相关产品推荐

