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])