Sql server 使用pyodbc和参数化查询将数据库读入数据帧

Sql server 使用pyodbc和参数化查询将数据库读入数据帧,sql-server,pandas,pyodbc,Sql Server,Pandas,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函数,在这里我可以将上面

我正在使用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的参数化功能与pandas的
pd.read\u sql\u query
pd.read\u sql
一起使用吗?

您可以用与
光标相同的方式参数化
read\u sql\u query
。通过设置
参数执行

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'})

这在SQL server上作为数据库驱动程序工作,现在我的数据库驱动程序更改为Microsoft ODBC for Oracle。您知道如何在这种情况下进行参数化吗?显然,在查询中使用“?”并在pd中添加参数。在这种情况下,read_sql(params)不起作用?在这种情况下是一个日期。谢谢正如您所发现的,查询中的参数化通常是特定于数据库的,我对Oracle不是很熟悉,但似乎您需要在查询中的参数名称前面加一个冒号,例如“:param1”,然后您可能需要将
param
参数设置为使用相同名称(不带冒号)和值的字典。这里有一个例子:用例子更新答案。非常感谢!我发现这个问题的答案是将python日期时间作为参数传递。