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

如何向pd.read_sql_query传入包含元组在内的多个自定义参数

多参数传入pd.read_sql_query的实现方案

你可以通过以下两种方式实现同时传入IN子句元组和其他自定义变量:

方法1:扩展字符串format占位符(适合内部可控变量场景)

直接在原有format写法的基础上增加占位符即可,示例代码如下:

# 自定义日期变量,若为datetime类型需先转为SQL兼容的字符串格式
start_date = "2021-07-25"
# 占位符{0}对应元组,{1}对应日期变量
data_raw_sql = pd.read_sql_query('''SELECT a, Date, c                    
                                 FROM table_d 
                                 WHERE a IN {0} 
                                 AND Date >= '{1}' '''.format(my_tuple, start_date), conn
                                 )

注意:该方法仅适合所有传入变量都是内部可控的场景,若变量来自外部用户输入会存在SQL注入风险。

方法2:参数化查询(推荐,安全无注入风险)

通过pandas自带的params参数传值,兼容所有类型的变量,适配不同数据库驱动,示例如下(以MySQL的%s占位符为例,SQLite需替换为?):

start_date = "2021-07-25"
# 生成IN子句对应的占位符,元组有多少个元素就生成多少个占位符
in_placeholders = ', '.join(['%s'] * len(my_tuple))
# 拼接SQL语句
sql = f'''SELECT a, Date, c                    
        FROM table_d 
        WHERE a IN ({in_placeholders}) 
        AND Date >= %s'''
# 按顺序传入所有参数:元组的所有元素 + 日期变量
params = list(my_tuple) + [start_date]
data_raw_sql = pd.read_sql_query(sql, conn, params=params)

该方法所有变量通过参数化传入,不会产生SQL注入风险,是生产环境的推荐写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:30:01