如何在pandas中使用单个变量对应多个SQL参数化标记
解决方案
方法1:使用命名参数(推荐)
大部分数据库连接驱动都支持命名占位符,你只需要给参数定义一个别名,传参时传入字典即可,无需重复定义参数值。
不同驱动的命名占位符格式略有差异,以下是示例代码:
import pandas as pd import datetime dt = datetime.date(2021, 10, 1) # 以冒号格式的命名占位符为例(适配sqlite、psycopg2等驱动) select_sql = """ SELECT Inception, Expiry FROM TableTest WHERE Inception <= :target_dt AND Expiry >= :target_dt """ # 传字典格式参数,只需要定义一次参数值 sql_query = pd.read_sql_query(select_sql, conn, params={"target_dt": dt})
如果使用MySQL驱动可将占位符替换为%(target_dt)s,SQL Server pyodbc驱动可替换为:1格式即可。
方法2:SQL层面预定义参数(兼容仅支持位置占位符的驱动)
如果你的数据库驱动仅支持?位置占位符,可在SQL语句中先将参数定义为临时变量,后续逻辑直接引用即可,仅需要传一次参数:
import pandas as pd import datetime dt = datetime.date(2021, 10, 1) select_sql = """ WITH params AS (SELECT ? AS target_dt) SELECT Inception, Expiry FROM TableTest, params WHERE Inception <= target_dt AND Expiry >= target_dt """ sql_query = pd.read_sql_query(select_sql, conn, params=[dt])
方法3:位置参数快捷写法
如果不想修改现有SQL语句,也可以用列表乘法语法避免重复写两次变量名,代码层面无需重复输入变量:
select_sql = """Select Inception, Expiry From TableTest Where Inception <= ? and Expiry >= ?""" # 用[dt]*2生成参数列表,不用重复写两次dt sql_query = pd.read_sql_query(select_sql, conn, params=[dt]*2)
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

