我在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的比较应为“如果cond为假:”或“如果不是 COND:“
好的,我觉得这很有道理。所以将我的代码更改为:
caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()
或
caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()
但他们都不能奏效。结果始终为0。 我认为filter子句不支持运算符“is”或“is not”。有人可以告诉我如何处理这种情况。我不想禁用片状。
答案 0 :(得分:60)
那是因为SQLAlchemy过滤器是== False
实际上有意义的少数几个地方之一。 其他地方您应该不使用它。
在该行中添加# noqa
条评论并完成。
或者您可以使用sqlalchemy.sql.expression.false
:
from sqlalchemy.sql.expression import false
TestCase.obsoleted == false()
其中false()
返回会话SQL方言的正确值。匹配sqlalchemy.expression.true
。
答案 1 :(得分:34)
答案 2 :(得分:1)
@Jruv在声明前面使用# noqa
,它会忽略警告。
答案 3 :(得分:0)
我看看当SQLAlchemy
和is_
用于布尔字段时,==
和database dialect is Postgresql
生成的确切查询是什么:
对于==
,我们得到:
field == False
转换为field = false
field == True
转换为field = true
field == None
转换为field IS NULL
对于is_()
,我们得到:
field.is_(False)
转换为field IS false
field.is_(True)
转换为field IS true
field.is_(None)
转换为field IS NULL
注意::is_(not None)
的评估结果为is_(bool(not None)
,是什么is_(True)
产生了field = true
,所以您宁愿进行isnot(None)
制作field IS NOT NULL
答案 4 :(得分:0)
为什么不使用 .filter_by(field=True)
/ .filter_by(field=False)
?
答案 5 :(得分:0)
caseNum = session.query(TestCase).filter(~TestCase.obsoleted).count()
print(caseNum)
works.try it in your sqlalchemy version