的Python cx_oracle通过位置绑定变量忽略号码

问题描述:

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

作为的Python cx_oracle通过位置绑定变量忽略号码

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" 

解释一样

sql = ":1, :2, :3, :4, :5, :6" 

被故意或者错误是什么?

+0

我猜cx_oracle总是以相同的方式计算这些绑定,从1开始。不过,您可以使用命名绑定。我发现它们也更清晰。 – MKesper

cx_Oracle正在使用具有此行为的OCI。您可以在此白皮书中读到它(第14页的底部和15页的顶部):

http://www.oracle.com/technetwork/database/database-technologies/php/whatsnew/building-best-drivers-131920.pdf

有效地从左至右并指定位置编号甲骨文扫描绑定中遇到它们的顺序变量。您可以使用命名的绑定变量来避免这种潜在的混淆。

+0

谢谢安东尼,你会发现这个危险的行为至少会在cx_Oracle文档中提到。 – Tibco

+0

我不确定我是否会称这种行为很危险,但我已在cx_Oracle文档中包含关于此的注释,以便其他人不会像您一样感到惊讶! –

+0

最后我意识到有一个复选标记:)因为这个原因我重写了我的迷你ORM,我花了几个星期的时间。不幸的是,SQL Developer将这些位置数字视为关键字参数,所以我最终认识到了这个“错误”。我预计它的工作方式与Python字符串格式相同,这对我来说很自然。 – Tibco