Python flake8抱怨布尔比较==&引用;在过滤子句中
我在mysql db表中有一个布尔字段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
# 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
或。is
-method。还请注意,当您使用=
将在任一操作数为NULL时返回NULL。
from sqlalchemy.sql.expression import false
TestCase.obsoleted == false()
Model.filter(Model.deleted.is_(False))