的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"
被故意或者错误是什么?
答
cx_Oracle正在使用具有此行为的OCI。您可以在此白皮书中读到它(第14页的底部和15页的顶部):
有效地从左至右并指定位置编号甲骨文扫描绑定中遇到它们的顺序变量。您可以使用命名的绑定变量来避免这种潜在的混淆。
我猜cx_oracle总是以相同的方式计算这些绑定,从1开始。不过,您可以使用命名绑定。我发现它们也更清晰。 – MKesper