web-dev-qa-db-ja.com

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との比較は、「条件がFalseの場合:」または「条件でない場合:」である必要があります。

わかりました。だから私のコードをこれに変更してください:

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

または

caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()

しかし、どちらも機能しません。結果は常に0です。フィルター句は演算子「is」または「is not」をサポートしていないと思います。この状況への対処方法を誰かに教えてもらえますか?フレークを無効にしたくありません。

56
Jruv

これは、SQLAlchemyフィルターが_== False_が実際に意味をなす数少ない場所の1つであるためです。 他のすべての場所では使用しないでください使用しない

_# noqa_コメントを行に追加して、コメントを完了します。

または、 _sqlalchemy.sql.expression.false_ を使用できます。

_from sqlalchemy.sql.expression import false

TestCase.obsoleted == false()
_

ここで、false()は、セッションSQLダイアレクトの正しい値を返します。一致する _sqlalchemy.expression.true_ があります。

62
Martijn Pieters

SQL Alchemyにはis_およびisnot使用できる関数。例は

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

ここの詳細

41
avoliva

@Jruvステートメントの前で# noqaを使用すると、警告は無視されます。

0
user3016020