绑定变量表名与cx_Oracle(Binding variable to table name wi

2019-10-17 08:36发布

我使用cx_Oracle Python中并不能得到一个变量作为表名,就像在这个简单的例子:

query = "select * from some.:usertable.userinfo"

bindvars = {'usertable':usertable}

cursor.execute(query, bindvars)

什么是正确的语法? 当我使用可变substition正常工作WHERE ......等,但不能与表名。 我想我必须分离“:用户表”不知何故?

Answer 1:

数据库适配器很少支持使用参数,任何不是“值”(一些需要引用)。 无论是使用字符串格式化(狡猾的,运行SQL注入的风险)或使用像SQLAlchemy的图书馆,它可以让你产生使用Python代码有效的SQL。

如果您确定您的usertable值是健全的(检查对现有的表名的列表,例如),下面的工作:

query = 'select * from some.{usertable}.userinfo'.format(usertable=usertable)


Answer 2:

你不能在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注入 。



文章来源: Binding variable to table name with cx_Oracle