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

