2017-02-17 18 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

Эффективно Oracle сканирует слева направо и присваивает номера позиций для связывания переменных в порядке их встречаются , Вместо этого вы можете использовать именованные переменные bind, чтобы избежать этой потенциальной путаницы.

+0

Спасибо Энтони, можно ожидать, что это опасное поведение будет, по крайней мере, упомянуто в документации cx_Oracle. – Tibco

+0

Я не уверен, что я бы назвал это поведение опасным, но я включил примечание об этом в документацию cx_Oracle, чтобы другие не были удивлены, как вы! –

+0

Наконец-то я понял, что есть галочка. Я потратил несколько лишних недель, переписав мой мини-ORM из-за этого. К сожалению, разработчик SQL обрабатывает эти позиционные числа как аргументы ключевого слова, поэтому я узнал эту «ошибку» в самом конце. Я ожидал, что он будет работать так же, как формат строки python, который кажется мне естественным. – Tibco