使用参数化查询的pyodbc将数据库读取到数据帧中



我使用pyodbc从SQL Server获取数据,使用此处显示的脚本:

conn = pyodbc.connect('DSN=DATASOURCE')
tbl = "SELECT TableA.Field_1 
FROM TableA 
WHERE TableA.Date>=2019/04/01"
SQL_Query = pd.read_sql_query(tbl, conn)
conn.close

现在我想把这个查询变成一个Python函数,在那里我可以把上面例子中的日期(2019/04/01(作为函数变量来更改。

我发现pyodbc提供了参数化,但都是在cursor.execute函数的上下文中。

理想情况下,我想创建一个这样的函数:

def DB_Query(date):
conn = pyodbc.connect('DSN=DATASOURCE')
tbl = "SELECT TableA.Field_1 
FROM TableA 
WHERE TableA.Date>=?", date
SQL_Query = pd.read_sql_query(tbl, conn)
conn.close
return SQL_Query

显然,这不起作用,因为tbl必须是一个正常的字符串,但有可能将pyodbc的参数化特性与panda的pd.read_sql_querypd.read_sql一起使用吗?

您可以通过设置params参数,以与cursor.execute相同的方式参数化read_sql_query:https://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.html

SQL Server示例:

import pandas as pd
sql = '''
select *
from Table
where Column = ?
'''
df = pd.read_sql(sql, params=[query_param])

Oracle示例:

import pandas as pd
sql = '''
select *
from table
where Column = :query_param
'''
df = pd.read_sql(sql, params={'query_param': 'query_value'})

最新更新