2015-11-24 2 views
0

Я создаю запрос, как это в Python peewee ORM:Почему peewee не вложил это предложение WHERE правильно?

myTableModel.records = myTableModel.select(
    myTableModel.table_field_name 
    ).where(
    (myTableModel.second_field_name.is_null(True) | 
    myTableModel.second_field_name == "") 
    ) 

Я могу работать обратно в SQL сгенерированного, запустив print myTableModel.records.sql()

SELECT `t1`.`table_field_name` 
FROM `table_name` AS t1 
WHERE (((`t1`.`second_field_name` IS NULL) OR `t1`.`second_field_name`) = ''); 

Это не использует правильный вложенности. Это заявление, которое я хочу:

SELECT `t1`.`table_field_name` 
FROM `table_name` AS t1 
WHERE `t1`.`second_field_name` IS NULL OR `t1`.`second_field_name` = ''; 

Существующий WHERE положение сводится к этому ...

WHERE `t1`.`second_field_name` IS NULL = '' 

... который производит ровно противоположное тому, что я хочу, возвращая все строки, где second_field_name есть неNULL.

Как исправить это? Я как-то неправильно ввел код Python?

ответ

-1

Через пробную версию и ошибку я обнаружил, что добавление еще двух скобок исправляет запрос. Скобки должны быть добавлены вокруг myTableModel.second_field_name == "" так:

myTableModel.records = myTableModel.select(
    myTableModel.table_field_name 
    ).where(
    (myTableModel.second_field_name.is_null(True) | 
    (myTableModel.second_field_name == "")) 
    ) 

Я не уверен, почему именно это помогает. Кажется, что Python и peewee должны иметь возможность использовать трубу и внешние скобки в качестве разделителей.

+0

Я создал проблему для этого на PeeWee GitHub https://github.com/coleifer/peewee/issues/769 –

1

Peewee опирается на парсер Python для генерации выражений. Из-за Python вам нужны скобки вокруг большинства сравнений. Здесь нет волшебства, просто Python.

http://docs.peewee-orm.com/en/latest/peewee/querying.html?highlight=precedence#expressions

+0

Можете ли вы определить «большинство»? Это кажется безудержно непоследовательным. Например, это работает '.where (modelObject.field_name << ['a', 'b', 'c'] | modelObject.field_name% '% word%')' –

+0

Просто поместите круглые скобки вокруг всех двоичных выражений, тогда вы не будет проблем. Это не повлияет на запрос вообще, и вы убедитесь, что получаете правильные результаты. В документах и ​​почти везде, каждый фрагмент кода делает это. Также см. Http://docs.peewee-orm.com/ru/latest/peewee/querying.html?highlight=precedence#expressions – coleifer