2013-02-14 96 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)