Синтаксис Peewee для выбора пустого поля

Я исследовал это везде и не могу найти ответ. Надеюсь, я не продублировал это (поскольку это мой первый вопрос о SO).

Я пытаюсь написать запрос выбора с Peewee, который обычно идет ... WHERE foo = NULL; в мире SQL.

MySQL выглядит так:

+-----------+-------------+------+-----+---------+----------------+  
| Field     | Type        | Null | Key | Default | Extra          |  
+-----------+-------------+------+-----+---------+----------------+  
| id        | bigint(20)  | NO   | PRI | NULL    | auto_increment |  
| user      | varchar(30) | NO   |     | NULL    |                |  
| peer      | varchar(30) | NO   |     | NULL    |                |  
| deleted   | date        | YES  |     | NULL    |                |  
| confirmed | date        | YES  |     | NULL    |                |  
+-----------+-------------+------+-----+---------+----------------+  

Мой запрос выбора выглядит следующим образом:

Peers.select().where(Peers.user == 'foo' and Peers.deleted is None)

Но это не работает! Я пробовал Peers.deleted == "" и Peers.deleted == "NULL". Синтаксис MySQL должен заканчиваться на WHERE deleted is NULL;, но в Peewee, похоже, ничего этого не делается.

Кто-нибудь может помочь? Что мне не хватает в документах?

Обновлено из комментария пользователя Foo Bar: and not Peers.deleted не сработало, но это привело меня к дополнительной информации. Кажется, крошка хочет, чтобы пункты where были связаны вместе. Итак, вместо

Peers.select().where(Peers.user == 'foo' and Peers.deleted is None)

должен быть:

Peers.select().where(Peers.user == 'foo').where(Peers.deleted is None)

К сожалению, это по-прежнему не дает правильного синтаксиса для выбора нулевых строк в удаленных.


person thaavik    schedule 08.10.2013    source источник
comment
может быть and not Peers.deleted   -  person Foo Bar User    schedule 09.10.2013


Ответы (1)


Прежде всего, вы должны использовать побитовые операнды для «и» и «или». Затем для null используйте >>:

Peers.select().where((Peers.user == 'foo') & Peers.deleted.is_null())

Для not null вы бы отрицали это:

Peers.select().where(Peers.deleted.is_null(False))

Это задокументировано: http://peewee.readthedocs.org/en/latest/peewee/querying.html#query-operators

person coleifer    schedule 10.10.2013
comment
Есть ли альтернатива >> None? Это совсем не интуитивно понятно, и, поскольку я не использую peewee каждый день, мне приходится каждый раз искать его :-( - person kev; 01.08.2016
comment
Да, двумя способами. Если вы сделаете .where(Foo.something == None), Peewee превратит его в IS NULL. Кроме того, вы можете сделать .where(Foo.something.is_null(True)). Точно так же .where(Foo.something.is_null(False)) произведет WHERE foo.something IS NOT NULL. - person coleifer; 02.08.2016