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

Python cx_oracle ignores numbers by positional bind variables

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

如我所料。为什么?

事实上所有的 :numbers 都被完全忽略了

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

的解释相同
sql = ":1, :2, :3, :4, :5, :6"

这是故意的还是错误?

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

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

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