Python cx_oracle通过位置绑定变量忽略数字

Python cx_oracle通过位置绑定变量忽略数字,python,cx-oracle,Python,Cx Oracle,被执行为 cursor.execute("SELECT * FROM t WHERE c1=:2 AND c2=:1", (1, 2)) 而不是 SELECT * FROM t WHERE c1=1 AND c2=2 如我所料。为什么? 事实上,所有这些数字都被完全忽略了 SELECT * FROM t WHERE c1=2 AND c2=1 其解释与 sql = ":5, :0, :0, :2, :1, :3" 这是故意的还是错误的?cx\u Oracle正在使用具有这种行为的OCI。

被执行为

cursor.execute("SELECT * FROM t WHERE c1=:2 AND c2=:1", (1, 2))
而不是

SELECT * FROM t WHERE c1=1 AND c2=2
如我所料。为什么?

事实上,所有这些数字都被完全忽略了

SELECT * FROM t WHERE c1=2 AND c2=1
其解释与

sql = ":5, :0, :0, :2, :1, :3"

这是故意的还是错误的?

cx\u Oracle正在使用具有这种行为的OCI。您可以在本白皮书(第14页底部和第15页顶部)中阅读:


实际上,Oracle从左到右扫描,并按照遇到变量的顺序为绑定变量分配位置号。您可以使用命名绑定变量来避免这种潜在的混淆。

我想cx\U oracle总是以相同的方式计算这些绑定,从1开始。不过,您可以使用命名绑定。我发现它们也更清楚了。谢谢你,Anthony,人们会认为这种危险行为至少会在cx\U Oracle文档中提到。我不确定我会称这种行为为危险行为,但我在cx\U Oracle文档中包含了一条关于这一点的注释,这样其他人就不会像你一样感到惊讶了!最后,我意识到有一个复选标记:)因为这个原因,我花了几个星期的时间重写了我的迷你ORM。不幸的是,SQL开发人员将这些位置号视为关键字参数,因此我在最后发现了这个“bug”。我希望它的工作方式与python字符串格式相同,这对我来说是很自然的。我可以看出它是多么令人困惑,尤其是SQL开发人员对它的处理方式有所不同!很高兴你找到了答案,希望文档中的代码片段能帮助其他人。
sql = ":1, :2, :3, :4, :5, :6"