操作员不在Peewee

时间:2014-09-08 23:24:54

标签: python sqlite peewee

文档显示here如何使用IN运算符,但我无法找到如何使用NOT IN运算符。

如果我输入not <<,我会收到语法错误。

如果我添加not <FieldName> <<,则会有WHERE False而不是像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

3 个答案:

答案 0 :(得分:20)

简单:

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

对于稍微不同的语义(NOT(x in y))而不是(x NOT IN y):

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

答案 1 :(得分:3)

我知道这是一个&#34; necro-posting&#34;,但这个问题首先在Google上针对peewee not in查询,所以我想在此处添加:

您还可以使用doc:

中描述的not_in方法
Tweet.select().where(Tweet.user.not_in(a_users))

就我而言,它看起来比~ ... <<构建更具可读性。

答案 2 :(得分:1)

这与Peewee无关,真的。 Peewee正在使用一些Python运算符来实现自己的目的。 <<通常是一个数字运算符,采用逻辑否定没有任何意义。因此not <<永远不是有效的Python语法。

您的第二个示例已结束,但not仅适用于Tweet.user(优先级高于not的{​​{1}})。添加一些括号,你得到:

<<

现在这仍然是不对的,正如您所发现的那样(读者:请参阅评论以进行一些讨论)。 Tweet.select().where(not (Tweet.user << a_users)).sql() 返回一个布尔值,这不是想要的,也不会起作用。为了这个,Peewee重新利用了not运营商;看看@ coleifer的答案。