PyODBC + Pandas + 参数化
PyODBC + Pandas + Parameterization
我正在使用 PyODBC 通过名为 cnxn 的连接连接到 Oracle。
我有一个唯一标识符列表:
list1 = [1234, 2345, 3456, 4567]
我也有疑问:
query1 = """
select * from tablename where unique_id = ?
""'
我想做的是使用这个标识符列表来创建一个 pandas 数据框。
作为测试,我这样做了:
testid = "1234" (since Oracle wants a string as that id not an integer)
但是,当我这样做时:
pd.read_sql(query1, cnxn, params = testid)
我得到"the sql contains 1 parameter marker, yet 4 were supplied."
最终,我希望能够做这样的事情:
for i in list1:
newdataframe.append(pd.read_sql(query1, cnxn, params = i))
让它吐出一个数据框。
我已经阅读了 PyODBC 上的文档,它似乎指定了 ?作为参数。
我也查看了 this question 并且它很相似,但我需要能够将结果输入 Pandas 数据框以便进一步操作。
我想如果我能让 testid 工作,我就会走上正轨。
谢谢
以下是包含连接详细信息的完整示例,但特定于 SQL 服务器。
因为您使用的是 ORACLE,所以您可以窃取 df_query 部分。我在这里要说明的要点是,您可以对参数值使用字符串格式,而不是在连接字符串中使用参数。
import os
import sqlalchemy as sa
import urllib
import pandas as pd
#Specify the databases and servers used for reading and writing data.
read_server = 'Server'
read_database = 'Database'
read_params = urllib.quote_plus("DRIVER={Server};SERVER={read_server};DATABASE={read_database};TRUSTED_CONNECTION=Yes".format(Server = 'SQL Server',read_server = read_server,read_database=read_database))
read_engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % read_params)
unique_id= 'id'
single_quote = "'"
df_query = """
SELECT *
FROM TABLE
WHERE UNIQUE_ID = {single_quote}{unique_id}{single_quote}
""".format(single_quote = single_quote,unique_id=unique_id)
DF = pd.read_sql_query(df_query,con=read_engine,index_col=None)
来自 pandas read_sql
docs:“params
:要传递给执行方法的参数列表”。
params
需要是列表(或元组),因此字符串被解释为 4 个单个字符的列表。但这很容易解决:
pd.read_sql(query1, cnxn, params=[testid])
我正在使用 PyODBC 通过名为 cnxn 的连接连接到 Oracle。
我有一个唯一标识符列表: list1 = [1234, 2345, 3456, 4567]
我也有疑问:
query1 = """
select * from tablename where unique_id = ?
""'
我想做的是使用这个标识符列表来创建一个 pandas 数据框。
作为测试,我这样做了:
testid = "1234" (since Oracle wants a string as that id not an integer)
但是,当我这样做时:
pd.read_sql(query1, cnxn, params = testid)
我得到"the sql contains 1 parameter marker, yet 4 were supplied."
最终,我希望能够做这样的事情:
for i in list1:
newdataframe.append(pd.read_sql(query1, cnxn, params = i))
让它吐出一个数据框。
我已经阅读了 PyODBC 上的文档,它似乎指定了 ?作为参数。 我也查看了 this question 并且它很相似,但我需要能够将结果输入 Pandas 数据框以便进一步操作。
我想如果我能让 testid 工作,我就会走上正轨。
谢谢
以下是包含连接详细信息的完整示例,但特定于 SQL 服务器。
因为您使用的是 ORACLE,所以您可以窃取 df_query 部分。我在这里要说明的要点是,您可以对参数值使用字符串格式,而不是在连接字符串中使用参数。
import os
import sqlalchemy as sa
import urllib
import pandas as pd
#Specify the databases and servers used for reading and writing data.
read_server = 'Server'
read_database = 'Database'
read_params = urllib.quote_plus("DRIVER={Server};SERVER={read_server};DATABASE={read_database};TRUSTED_CONNECTION=Yes".format(Server = 'SQL Server',read_server = read_server,read_database=read_database))
read_engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % read_params)
unique_id= 'id'
single_quote = "'"
df_query = """
SELECT *
FROM TABLE
WHERE UNIQUE_ID = {single_quote}{unique_id}{single_quote}
""".format(single_quote = single_quote,unique_id=unique_id)
DF = pd.read_sql_query(df_query,con=read_engine,index_col=None)
来自 pandas read_sql
docs:“params
:要传递给执行方法的参数列表”。
params
需要是列表(或元组),因此字符串被解释为 4 个单个字符的列表。但这很容易解决:
pd.read_sql(query1, cnxn, params=[testid])