2013-10-08 27 views
13

我對此進行了各種研究,似乎無法找到答案。我希望我沒有重複這個(因爲這是我的第一個問題)。Peewee在空字段上選擇的語法

我想寫一個通常會去的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)

可悲的是,這仍然沒有得到正確的語法中刪除了空行選擇。

+0

也許'而不是Peers.deleted' –

回答

16

首先,您必須使用「和」和「或」的位操作數。那麼對於爲null,則使用>>

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

對於不爲空,你會否定它:

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

據記載:http://peewee.readthedocs.org/en/latest/peewee/querying.html#query-operators

+0

是的!太神奇了,謝謝!這就是答案。 – thaavik

+0

有沒有替代'>>無'?這根本不直觀,因爲我每天都不用偷看它:-( – kev

+3

是的,有兩種方法,如果你做'.where(Foo.something == None)'Peewee將會轉向它變成「IS NULL」。或者,你可以做'.where(Foo.something.is_null(True))'。同樣,'.where(Foo.something.is_null(False))'會產生'WHERE foo.something不是NULL「。 – coleifer