Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flake8抱怨布尔比较==&引用;在过滤子句中_Python_Mysql_Sqlalchemy_Flake8 - Fatal编程技术网

Python flake8抱怨布尔比较==&引用;在过滤子句中

Python flake8抱怨布尔比较==&引用;在过滤子句中,python,mysql,sqlalchemy,flake8,Python,Mysql,Sqlalchemy,Flake8,我在mysql db表中有一个布尔字段 # table model class TestCase(Base): __tablename__ = 'test_cases' ... obsoleted = Column('obsoleted', Boolean) 要获得所有未过时测试用例的计数,可以这样简单地完成: caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count() p

我在mysql db表中有一个布尔字段

# table model
class TestCase(Base):
    __tablename__ = 'test_cases'
    ...
    obsoleted = Column('obsoleted',  Boolean)
要获得所有未过时测试用例的计数,可以这样简单地完成:

caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
print(caseNum)
这工作正常,但flake8报告以下警告:

E712:与False的比较应为“如果条件为False:”或“如果条件不为False:” 条件:“

好吧,我认为这是有道理的。因此,将我的代码更改为:

caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()

但它们都不能工作。结果总是0。
我认为filter子句不支持运算符“is”或“is not”。有人能告诉我如何处理这种情况吗。我不想禁用雪花

这是因为SQLAlchemy过滤器是少数几个真正有意义的地方之一其他地方您不应该使用它

在行中添加一条
#noqa
注释,并完成注释

或者您可以使用:


其中
false()
为会话SQL方言返回正确的值。有一个匹配的。

SQL Alchemy也有
is_
isnot
可以使用的函数。例如

Model.filter(Model.deleted.is_(False))

@Jruv Use
#noqa
在语句前面,它将忽略警告。

我查看了当
==
和for boolean字段:

  • 对于
    ==
    ,我们得到:

  • field==False
    转换为
    field=False
  • field==True
    转换为
    field=True
  • 字段==None
    转换为
    字段为空
  • 对于
    is()
    我们得到:

  • field.is(False)
    转换为
    field is False
  • field.is(True)
    转换为
    field is True
  • 字段为空(无)
    转换为
    字段为空

注意:
is(非无)
将被评估为
is(非无)
给出的
is(真)
给出的
field=True
因此您宁愿选择
isnot(无)
生成的
字段不为空
为什么不使用
.filter\u by(field=True)
.filter\u by(field=False)

caseNum=session.query(TestCase).filter(~TestCase.obsoleted).count()
打印(caseNum)

有效。在您的sqlalchemy版本中试用它

特别建议不要使用“如果cond为False”在Python中,
is
=
是不同的,但是我很确定这里生成的SQL是相同的。
is
=
在SQLAlchemy中是不同的,因为您不能重写标识操作符(
is
)在python中,像
Model.column这样的表达式为False
总是被计算为
False
,因为比较总是在python中立即进行,而不是在数据库中。比较column对象和布尔值的标识的结果总是
False
。这会插入像
这样的语句,其中False
ode>和FALSE,这在大多数情况下都会导致查询返回0行。noqa将对整个字符串禁用flake 8/pep/其他linter,因此其他linter警告也将被忽略。其他答案提供了更好的解决方案,例如,
。is
-method。还请注意,当您使用时e> 是而不是PostgreSQL中的=,即使操作数为NULL,也永远不会得到NULL作为答案。
=
将在任一操作数为NULL时返回NULL。
from sqlalchemy.sql.expression import false

TestCase.obsoleted == false()
Model.filter(Model.deleted.is_(False))