我使用cx_Oracle Python中并不能得到一个变量作为表名,就像在这个简单的例子:
query = "select * from some.:usertable.userinfo"
bindvars = {'usertable':usertable}
cursor.execute(query, bindvars)
什么是正确的语法? 当我使用可变substition正常工作WHERE
......等,但不能与表名。 我想我必须分离“:用户表”不知何故?
我使用cx_Oracle Python中并不能得到一个变量作为表名,就像在这个简单的例子:
query = "select * from some.:usertable.userinfo"
bindvars = {'usertable':usertable}
cursor.execute(query, bindvars)
什么是正确的语法? 当我使用可变substition正常工作WHERE
......等,但不能与表名。 我想我必须分离“:用户表”不知何故?
数据库适配器很少支持使用参数,任何不是“值”(一些需要引用)。 无论是使用字符串格式化(狡猾的,运行SQL注入的风险)或使用像SQLAlchemy的图书馆,它可以让你产生使用Python代码有效的SQL。
如果您确定您的usertable
值是健全的(检查对现有的表名的列表,例如),下面的工作:
query = 'select * from some.{usertable}.userinfo'.format(usertable=usertable)
你不能在Oracle中绑定的对象名称,只有文字。 Oracle不,然而,有一个内置的包dbms_assert
,以帮助使用动态对象名称时防止SQL注入。 你的情况最有用的功能可能是sql_object_name
,其中:
“......验证输入参数字符串是一个现有的SQL对象的合格SQL标识符”。
举例来说,你可以做cx_Oracle以下。
object_name = cursor.callfunc('sys.dbms_assert.sql_object_name'
, cx_Oracle.string, ['usertable'])
它提出了ORA-44002,如果名称是无效的,你可以在cx_Oracle捕捉 ,或者如果一切正常继续的Martijn已建议。
我会推荐阅读Oracle的指导防范SQL注入 。