我是一个Python新手,我在使用绑定变量时遇到了麻烦。如果我执行下面的代码,一切正常。
bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind"
cur.prepare(sql)
cur.execute(sql,bind)
相反,如果我添加另一个绑定变量,我会收到错误。
bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.prepare(sql)
cur.execute(sql,(bind,bind))
cur.execute(sql,(bind,bind))
Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data
我用
解决了这个问题cur.execute(sql,(bind["var"],bind["var"]))
但我无法理解为什么上一个命令不正常。
使用绑定变量的正确方法是什么?我正在使用cx_Oracle。
答案 0 :(得分:4)
@ffarquest说cx_Oracle不支持使用字典,但事实上,@ giovanni-de-ciantis只是错误地使用它。
named_params = {'dept_id':50, 'sal':1000}
query1 = cursor.execute(
'SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal',
named_params
)
OR
query2 = cursor.execute(
'SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal',
dept_id=50,
sal=1000
)
在给定的示例中,我认为对:bind
的第二个引用需要用不同的东西替换,因为它不是按顺序完成的。此外,重命名变量bind
以消除混淆。
bind_dict = {bind:"var" : diff:"ciao"}
sql = "select * from sometable where somefield=:bind and otherfield=:diff"
cur.prepare(sql)
cur.execute(sql, bind_dict )
本文来自2007年,显示您可以使用字典: http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html