簡體   English   中英

操作員不在Peewee

[英]Operator NOT IN with Peewee

文檔顯示如何使用IN運算符,但我找不到如何使用NOT IN運算符。

如果我把一個not <<我得到一個語法錯誤。

如果我放一個not <FieldName> <<那么有一個WHERE False而不是像WHERE (<FieldName> NOT IN (SELECT ...那樣的子查詢WHERE (<FieldName> NOT IN (SELECT ...

這是帶有文檔示例的輸出。 第一個是正確的,第二個和第三個是錯誤的。

>>> Tweet.select().where(Tweet.user << a_users).sql()
('SELECT t1."id", t1."user_id", t1."message", t1."created_date", t1."is_published" FROM "tweet" AS t1 WHERE (t1."user_id" IN (SELECT t2."id" FROM "user" AS t2 WHERE (Lower(Substr(t2."username", ?, ?)) = ?)))', [1, 1, 'a'])
>>> Tweet.select().where(not Tweet.user << a_users).sql()
('SELECT t1."id", t1."user_id", t1."message", t1."created_date", t1."is_published" FROM "tweet" AS t1 WHERE ?', [False])
>>> Tweet.select().where(Tweet.user not << a_users).sql()
SyntaxError: invalid syntax

簡單:

Tweet.select().where(Tweet.user.not_in(a_users))

對於稍微不同的語義(NOT(x in y))而不是(x NOT IN y):

Tweet.select().where(~(Tweet.user << a_users))

我知道這是一個“死亡帖子”,但這個問題首先出現在谷歌的peewee not in查詢,所以我想在這里添加:

您還可以使用doc中描述的not_in方法:

Tweet.select().where(Tweet.user.not_in(a_users))

至於我,它看起來比~ ... <<構造更具可讀性。

這與Peewee毫無關系,真的。 Peewee正在使用一些Python運算符來實現自己的目的。 <<通常是一個數字運算符,並且采用其邏輯否定沒有任何意義。 因此, not <<從來not <<是有效的Python語法。

您的第二個示例是關閉的,但not適用於Tweet.user (優先級not高於<< )。 添加一些括號,你會得到:

Tweet.select().where(not (Tweet.user << a_users)).sql()

現在這仍然是不對的 ,正如你已經發現的那樣(讀者:請參閱評論以便對此進行一些討論)。 not返回布爾值,這不是想要的,也不會起作用。 為了這個,Peewee重新利用~運算符; 看看@ coleifer的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM