91

我在 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 的比较应该是“if cond is False:”或“if not 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”。有人可以告诉我如何处理这种情况。我不想禁用薄片。

4

6 回答 6

114

那是因为 SQLAlchemy 过滤器是少数几个== False真正有意义的地方之一。你不应该其他任何地方使用它。

向该行添加# noqa注释并完成它。

或者您可以使用sqlalchemy.sql.expression.false

from sqlalchemy.sql.expression import false

TestCase.obsoleted == false()

wherefalse()返回会话 SQL 方言的正确值。有一个匹配sqlalchemy.expression.true

于 2013-09-25T06:50:28.340 回答
91

SQL Alchemy 还具有您可以使用的功能is_isnot一个例子是

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

更多关于这里的

于 2016-04-13T17:05:53.920 回答
21

我看看SQLAlchemy在何时==以及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 = trueisnot(None)field IS NOT NULL

于 2019-12-13T15:13:26.700 回答
1

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

于 2017-10-12T09:28:21.503 回答
1
caseNum = session.query(TestCase).filter(~TestCase.obsoleted).count()
print(caseNum)

works.try 在你的 sqlalchemy 版本中

于 2021-05-23T17:05:50.640 回答
1

你为什么不使用.filter_by(field=True)/ .filter_by(field=False)

于 2021-03-24T14:29:12.387 回答