私は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イオンはちょうど...不愉快です。可能であれば、カーソルオブジェクトを作成せずにこれを実行したいと思います。ちょうどパンダを使ってすべてのことをする方法はありますか?
それはSQLインジェクション攻撃に対して脆弱コードを離れると、私は強くあなたのSQLの形成に対して、この方法をお勧めします。たとえあなたのコード/データベースが脆弱な位置にいなくても、このようにSQLを形成する習慣に入るべきではありません。バインド変数は安全な方法です。 @DavidMarxが同意した。 –
私は通常通り、OPがコマンドライン(または基本的なスクリプト)から作業していると仮定してはいけません。 –
[参考:私はOPです]ええ、これは自己完結型のファイルです。私は現在のプログラムでSQLインジェクションの実際の問題を予期していません。なぜなら、それを使用する人はデータベースに直接アクセスできるからです。しかし、私がパンダを使用できるかどうかを知りたいのですが記載されている。 –