Синтаксис Peewee для выбора нулевого поля
Я исследовал это повсюду и не могу найти ответа. Надеюсь, я не дублировал это (как мой первый вопрос о SO).
Я пытаюсь написать select-запрос с 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
не работал, но это привело меня к дополнительной информации. Кажется, что peewee хочет, чтобы предложения where
были соединены вместе. Поэтому вместо
Peers.select().where(Peers.user == 'foo' and Peers.deleted is None)
это должно быть:
Peers.select().where(Peers.user == 'foo').where(Peers.deleted is None)
К сожалению, это все еще не дает правильного синтаксиса для выбора нулевых строк при удалении.
Ответы
Ответ 1
Сначала вы должны использовать побитовые операнды для "и" и "или". Тогда для значение null, используйте >>
:
Peers.select().where((Peers.user == 'foo') & Peers.deleted.is_null())
Для не null вы можете свести его на нет:
Peers.select().where(Peers.deleted.is_null(False))
Документировано: http://peewee.readthedocs.org/en/latest/peewee/querying.html#query-operators