【问题标题】:Read database into dataframe using pyodbc with parameterized query使用带有参数化查询的 pyodbc 将数据库读入数据框
【发布时间】:2020-02-24 21:18:48
【问题描述】:

我正在使用 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 提供了parameterization,但都是在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_sql_querypd.read_sql 一起使用?

【问题讨论】:

    标签: sql-server pandas pyodbc


    【解决方案1】:

    您可以通过设置params 参数以与cursor.execute 相同的方式参数化read_sql_queryhttps://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'})
    

    【讨论】:

    • 这在 SQL 服务器上作为数据库驱动程序工作,现在我的数据库驱动程序更改为 Microsoft ODBC for Oracle。您是否碰巧知道如何在这种情况下进行参数化?显然使用“?”在查询中并在 pd.read_sql(params) 中添加 params 参数在这种情况下不起作用。 ?在这种情况下是 DATE。谢谢!
    • 查询中的参数化通常是特定于数据库的,正如您所发现的,我对 Oracle 不是很熟悉,但似乎您需要在查询中的参数名称前加上冒号,例如":param1",然后您可能需要将param 参数设置为使用相同名称(不带冒号)和值的字典。这是一个示例:stackoverflow.com/a/51790579/114174
    • 用例子更新了答案。
    • 非常感谢!我发现这个问题的答案是将 python 日期时间作为参数传递。 stackoverflow.com/questions/60421591/…
    猜你喜欢
    • 2020-06-10
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多