首页 > 解决方案 > 使用带有参数化查询的 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 的参数化功能与 pandaspd.read_sql_querypd.read_sql?

标签: sql-serverpandaspyodbc

解决方案


您可以通过与设置参数read_sql_query相同的方式进行参数化: https ://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.htmlcursor.executeparams

SQL Server 示例:

import pandas as pd

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

甲骨文的例子:

import pandas as pd

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

推荐阅读