[英]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.