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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:09:01