用于在空字段上选择的Peewee语法

tha*_*vik 15 python mysql null isnull 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    |                |  
+-----------+-------------+------+-----+---------+----------------+  
Run Code Online (Sandbox Code Playgroud)

我的选择查询如下所示:

Peers.select().where(Peers.user == 'foo' and Peers.deleted is None)
Run Code Online (Sandbox Code Playgroud)

但它不起作用!我试过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)

遗憾的是,仍然没有产生正确的语法来选择已删除的空行.

col*_*fer 24

首先,您必须使用"和"和"或"的按位操作数.然后for为null,使用>>:

Peers.select().where((Peers.user == 'foo') & Peers.deleted.is_null())
Run Code Online (Sandbox Code Playgroud)

如果不为null,你会否定它:

Peers.select().where(Peers.deleted.is_null(False))
Run Code Online (Sandbox Code Playgroud)

记录在案:http://peewee.readthedocs.org/en/latest/peewee/querying.html#query-operators

  • 是的,有两种方式.如果你做`.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`. (3认同)