flake8抱怨过滤子句中的布尔比较“==”

时间:2013-09-25 06:44:57

标签: 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()
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”。有人可以告诉我如何处理这种情况。我不想禁用片状。

6 个答案:

答案 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)

SQL Alchemy还具有您可以使用的isnotModel.filter(Model.deleted.is_(False)) 个函数。一个例子是

{{1}}

More on those here

答案 2 :(得分:1)

@Jruv在声明前面使用# noqa,它会忽略警告。

答案 3 :(得分:0)

我看看当SQLAlchemyis_用于布尔字段时,==database dialect is Postgresql生成的确切查询是什么:

  • 对于==,我们得到:

    1. field == False转换为field = false
    2. field == True转换为field = true
    3. field == None转换为field IS NULL
  • 对于is_(),我们得到:

    1. field.is_(False)转换为field IS false
    2. field.is_(True)转换为field IS true
    3. 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