2013-02-14 15 views
5

私はOracleデータベースを使っています。私はずっとこれを行うことができます。バインド変数を使用するデータベースクエリからpandasデータフレームを作成する

import pandas as pd 
    import pandas.io.sql as psql 
    import cx_Oracle as odb 
    conn = odb.connect(_user +'/'+ _pass +'@'+ _dbenv) 

    sqlStr = "SELECT * FROM customers" 
    df = psql.frame_query(sqlStr, conn) 

をしかし、私はそうのように、バインド変数を処理する方法がわからない:

sqlStr = """SELECT * FROM customers 
       WHERE id BETWEEN :v1 AND :v2 
      """ 

私はこれらのバリエーションを試してみた:

params = (1234, 5678) 
    params2 = {"v1":1234, "v2":5678} 

    df = psql.frame_query((sqlStr,params), conn) 
    df = psql.frame_query((sqlStr,params2), conn) 
    df = psql.frame_query(sqlStr,params, conn) 
    df = psql.frame_query(sqlStr,params2, conn) 

次の作品:

curs = conn.cursor() 
    curs.execute(sqlStr, params) 
    df = pd.DataFrame(curs.fetchall()) 
    df.columns = [rec[0] for rec in curs.description] 

しかし、このsolutイオンはちょうど...不愉快です。可能であれば、カーソルオブジェクトを作成せずにこれを実行したいと思います。ちょうどパンダを使ってすべてのことをする方法はありますか?

答えて

1

私が知る限り、pandasはSQL文字列が完全に形成されてから渡されることを期待しています。

params = (1234, 5678) 
sqlStr = """ 
SELECT * FROM customers 
WHERE id BETWEEN %d AND %d 
""" % params 
print(sqlStr) 

だからそれがうまくpsql.frame_queryに供給すべき

SELECT * FROM customers 
WHERE id BETWEEN 1234 AND 5678 

を与える:このことを念頭に置いて、私は(といつもの)文字列の補間を使用します。 (これは私の経験では、postgres、mysql、およびSQLサーバーで行います)。

+0

それはSQLインジェクション攻撃に対して脆弱コードを離れると、私は強くあなたのSQLの形成に対して、この方法をお勧めします。たとえあなたのコード/データベースが脆弱な位置にいなくても、このようにSQLを形成する習慣に入るべきではありません。バインド変数は安全な方法です。 @DavidMarxが同意した。 –

+0

私は通常通り、OPがコマンドライン(または基本的なスクリプト)から作業していると仮定してはいけません。 –

+0

[参考:私はOPです]ええ、これは自己完結型のファイルです。私は現在のプログラムでSQLインジェクションの実際の問題を予期していません。なぜなら、それを使用する人はデータベースに直接アクセスできるからです。しかし、私がパンダを使用できるかどうかを知りたいのですが記載されている。 –

1

pandas.io.sql.read_sql_queryを試してみてください。私はそれが働いた、私はそれを使用し、パンダのバージョン0.20.1を使用:

import pandas as pd 
import pandas.io.sql as psql 
import cx_Oracle as odb 
conn = odb.connect(_user +'/'+ _pass +'@'+ _dbenv) 

sqlStr = """SELECT * FROM customers 
      WHERE id BETWEEN :v1 AND :v2 
""" 
pars = {"v1":1234, "v2":5678} 
df = psql.frame_query(sqlStr, conn, params=pars) 
関連する問題