Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用cx\U Oracle将变量绑定到表名_Python_Oracle_Cx Oracle - Fatal编程技术网

Python 使用cx\U Oracle将变量绑定到表名

Python 使用cx\U Oracle将变量绑定到表名,python,oracle,cx-oracle,Python,Oracle,Cx Oracle,我在Python中使用cx_Oracle,无法获取用作表名的变量,如下面的简单示例所示: query = "select * from some.:usertable.userinfo" bindvars = {'usertable':usertable} cursor.execute(query, bindvars) 正确的语法是什么?当我使用WHERE…等时,变量substation可以正常工作,但不能与表名一起使用。我想我必须以某种方式分离“:usertable…”数据库适配器很少支

我在Python中使用cx_Oracle,无法获取用作表名的变量,如下面的简单示例所示:

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

bindvars = {'usertable':usertable}

cursor.execute(query, bindvars)

正确的语法是什么?当我使用
WHERE
…等时,变量substation可以正常工作,但不能与表名一起使用。我想我必须以某种方式分离“:usertable…”

数据库适配器很少支持对任何非“值”(需要引用的内容)的对象使用参数。要么使用字符串格式(不可靠,会有sql注入的风险),要么使用像SQLAlchemy这样的库,让您使用Python代码生成有效的sql

如果您确定您的
usertable
值是正常的(例如,对照现有表名列表进行检查),则以下操作可行:

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

不能在Oracle中绑定对象名,只能绑定文本。然而,Oracle有一个内置的包,在使用动态对象名称时帮助防止SQL注入。在您的案例中,最有用的功能可能是:

“…验证输入参数字符串是否为限定的SQL 现有SQL对象的标识符。“

例如,您可以在cx_Oracle中执行以下操作

object_name = cursor.callfunc('sys.dbms_assert.sql_object_name'
                             , cx_Oracle.string, ['usertable'])
它会引发ORA-44002,如果名称无效,或者如果一切正常,请按照Martijn的建议继续


我建议您阅读Oracle的指南。

数据库适配器很少支持对任何非“值”(需要引用的内容)使用参数。要么使用字符串格式(狡猾,有sql注入的风险),要么使用像SQLAlchemy这样的库,让您使用Python代码生成有效的sql。@septi:我认为使用表名作为绑定变量是不可能的,您需要创建一个动态语句,方法是将表名附加到select语句中。好的,谢谢,至少我可以停止浪费时间;-)你能补充一个答案吗?这样我就可以接受了?