2017-02-17 34 views
1
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

回答

1

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