【问题标题】:How to replace '?' in cx_Oracle query with the values provided如何替换“?”在 cx_Oracle 查询中使用提供的值
【发布时间】:2020-05-01 00:59:37
【问题描述】:
 cur.execute('select* form table where a = '?' and b = '?' and c = '?'', (val1,val2,val3))

我想用 val1,2,3 替换这些占位符

【问题讨论】:

  • 你遇到了什么问题?
  • 一个字符串从引号开始,在下一个相应的引号结束,所以你的字符串是'select* form table where a = ',然后你在字符串外面有一个?,然后开始另一个字符串......等等。如果您要使用绑定变量?,则不要将它们括在引号中。如果您想要字符串值,则在 SQL 字符串文字的 SQL 语句中使用双引号开始/结束 Python 字符串和单引号。另外,你有一个错字from 而不是form

标签: python sql oracle cx-oracle


【解决方案1】:

您没有说明您使用的是哪个 SQL 库,但除非您使用的是非常奇特的东西,否则您应该省略占位符周围的引号:

cur.execute('select * from table where a = ? and b = ? and c = ?', (val1,val2,val3))

SQL 库将采取适当的措施将值传输到数据库引擎!

【讨论】:

  • 同意你不应该引用?。但是,“SQL 库会为您处理引用。”不,任何理智的库都不会添加引号,而是将查询直接传递给 Oracle,Oracle 会将 ? 视为绑定变量,因此无需引用传入的变量。
  • @MT0 真;编辑了一下。我当然希望 psycopg2 和 sqlite 不要将我的数据发送给 Oracle! =)
  • 标签表明它是Oracle,它不是特别奇特,但它不使用'?'占位符。
【解决方案2】:

Oracle 不使用“?”作为绑定变量的占位符。它使用冒号前缀的名称,例如 :1:empno

请参阅 cx_Oracle 文档中的 Using Bind Variables。另请查看examples

尝试类似:

cur.execute('select * from table where a = :abv and b = :bbv and c = :cbv', [val1, val2, aval3])

cur.execute('select * from table where a = :abv and b = :bbv and c = :cbv', abv = val1, bbv = val2, cbv = val3])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多