20

我到处研究过这个问题,似乎找不到答案。我希望我没有重复这个(因为这是我关于 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,但它让我了解了更多信息。似乎 peewee 希望将where条款链接在一起。所以而不是

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

它应该是:

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

可悲的是,这仍然没有产生正确的语法来选择已删除的空行。

4

1 回答 1

34

首先,您必须对“and”和“or”使用按位操作数。然后 for 为空,使用>>

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

于 2013-10-10T21:42:13.243 回答