使用pd.read_sql_query传参如何避免字符串被自动添加单引号
问题原因
参数化查询对字符串类型参数自动添加单引号是设计如此,目的是转义特殊字符、防范SQL注入,属于正常机制。你将拼接好的ID串作为单个字符串传入的写法不符合参数化查询的使用规范,才会出现IN条件里整个串被包裹单引号的问题,导致SQL逻辑错误。
正确解决方案(安全无注入风险)
不要提前拼接ID为字符串,改为动态生成对应数量的参数占位符,代码示例如下:
import pandas as pd # 1. 保留ID为列表格式,不要提前拼接为字符串 itemids = [282940499, 276686324, 2665846, 46875436, 530272885, 2590230, 557021480, 282937154, 46259344] # 2. 动态生成IN子句的命名占位符 placeholders = ', '.join([f'%({idx})s' for idx in range(len(itemids))]) # 3. 拼接完整SQL语句 query = f''' SELECT xxx, yyy, zzz FROM tablexyz WHERE some_column_name IN ({placeholders}) ''' # 4. 构造参数字典 sql_parameter = {str(idx): itemid for idx, itemid in enumerate(itemids)} # 5. 执行查询 df = pd.read_sql_query(query, self.connection, params=sql_parameter)
不推荐的替代方案(仅适用于ID完全可控、无外部输入的场景)
如果确认所有ID都由你自己生成、不存在恶意输入风险,可以直接用Python字符串格式化拼接SQL,跳过参数化对IN参数的处理:
# 注意:该写法存在SQL注入风险,禁止用于有用户输入的业务场景 query = f''' SELECT xxx, yyy, zzz FROM tablexyz WHERE some_column_name IN ({itemids_str}) ''' df = pd.read_sql_query(query, self.connection)
内容的提问来源于stack exchange,提问作者ThatQuantDude
相关产品推荐
相关产品推荐

