2016-05-16 73 views
0

我使用PyODBC通过名为cnxn的连接连接到Oracle。PyODBC + Pandas +参数化

我唯一标识符的列表: 列表1 = 1234,2345,3456,4567]

我也有一个查询:

query1 = """ 
select * from tablename where unique_id = ? 
""' 

我想怎么办使用这个标识符列表来创建一个熊猫数据框。

作为一个测试,我这样做:

testid = "1234" (since Oracle wants a string as that id not an integer) 

然而,当我这样做:

pd.read_sql(query1, cnxn, params = testid) 

我得到“的SQL包含1个参数标记,但都提供4”。

最后,我希望能够做这样的事情:

for i in list1: 
    newdataframe.append(pd.read_sql(query1, cnxn, params = i)) 

,并把它吐出一个数据帧。

我已阅读PyODBC上的文档,它看起来像它指定?作为参数。 我也看过this question,它很相似,但我需要能够将结果反馈给Pandas数据框以供进一步操作。

我想如果我能得到testid的工作,我会走在正确的轨道上。

谢谢

+0

刚刚更新以在查询被解析后添加单引号。 – PyNoob

回答

2

pandas read_sql docs: “params:参数表传递给执行方法”。

params需要是一个列表(或元组),因此该字符串被解释为一个4个单个字符的列表。但是这可以很容易地解决:

pd.read_sql(query1, cnxn, params=[testid]) 
0

以下是连接详细信息的完整示例,但是SQL Server特定。

由于您使用的是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)