使用带参数化查询的pyodbc将数据库读入数据框
Read database into dataframe using pyodbc with parameterized query
我正在使用 pyodbc 从 SQL 服务器获取数据,使用此处显示的脚本:
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_query
或 [=15 一起使用=]?
您可以通过设置 params
参数以与 cursor.execute
相同的方式参数化 read_sql_query
:
https://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.html
SQL 服务器示例:
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'})
我正在使用 pyodbc 从 SQL 服务器获取数据,使用此处显示的脚本:
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_query
或 [=15 一起使用=]?
您可以通过设置 params
参数以与 cursor.execute
相同的方式参数化 read_sql_query
:
https://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.html
SQL 服务器示例:
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'})