2016-05-16 99 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)