Python 使用cx\U Oracle将变量绑定到表名
我在Python中使用cx_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…”数据库适配器很少支
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语句中。好的,谢谢,至少我可以停止浪费时间;-)你能补充一个答案吗?这样我就可以接受了?