2016-05-16 11 views
0

私はPyNodeを使ってOracleに接続しています。PyODBC + Pandas + Parameterization

私は一意の識別子のリストを持っている: リスト1 = [1234、2345、3456、4567]

私は、クエリを持っている:

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

私が何をしたいのですがどのようなこの識別子のリストを使用して、パンダのデータフレームを作成します。

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

私は取得 "SQLは1つのパラメーター・マーカーが含まれている、まだ4が供給された。":私はこれを行う際に、しかし

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

はテストとして、私はこれをしませんでした

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

、それがデータフレームを吐き出す持っている:

は最終的に、私はこのような何かを行うことができるようにしたいです。

私はPyODBCでドキュメントを読んだことがありますか?パラメータとして使用します。 私はthis questionも見てきましたが、それと似ていますが、結果をPandasデータフレームに入力してさらに操作する必要があります。

私はtestidを得ることができると思う、私は正しい軌道になるでしょう。

ありがとうございます。

+0

クエリが解析された後に単一引用符を追加するように更新しました。 – PyNoob

答えて

2

: "params:パラメータのリストは、メソッドを実行するために渡します"。

paramsはリスト(またはタプル)である必要があるため、文字列は4つの単一文字のリストとして解釈されます。しかし、これは簡単に解決することができます:

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

以下は、接続の詳細を含む完全な例ですが、SQL Server固有のものです。

ORACLEを使用しているため、df_queryパーツを盗むことができます。ここで説明しようとしているのは、接続文字列にparamsを使用する代わりに、パラメータ値に文字列書式を使用できることです。 pandas read_sql docsから

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)