2013-02-14 76 views
5

我與Oracle數據庫操作的數據庫查詢大熊貓數據幀。我可以這樣做了:創建從使用綁定變量

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] 

但這個解決方案離子只是...不雅。如果可以,我想在不創建遊標對象的情況下執行此操作。有沒有辦法只用熊貓來做整個事情?

回答

1

據我所知,熊貓預計,SQL字符串之前完全將它傳遞形成。考慮到這一點,我會(和經常做)使用字符串插值:

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

這給

SELECT * FROM customers 
WHERE id BETWEEN 1234 AND 5678 

所以應該送入psql.frame_query就好了。 (它在我的經驗中使用postgres,mysql和sql server)。

+0

我會強烈建議不要形成你的SQL,因爲它讓你的代碼容易受到SQL注入攻擊這種方式。即使你的代碼/數據庫不處於易受攻擊的地位,你也不應該以這種方式形成你的SQL。綁定變量是安全的方法。 – 2013-02-15 15:34:42

+0

@DavidMarx同意。我不應該像以前那樣假設OP是從命令行(或者只是一個基本腳本)開始工作的。 – 2013-02-15 16:25:18

+0

[僅供參考:我是OP]是的,這是一個自包含的文件。在目前的程序中,我沒有預見到任何SQL注入的真正問題,因爲使用它的人可以直接訪問數據庫,但我想知道未來是否可以像我一樣使用熊貓描述。 – 2013-02-15 20:59:43

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)