web-dev-qa-db-fra.com

flake8 se plaint de la comparaison booléenne "==" dans la clause de filtre

J'ai un champ booléen dans la table mysql db. 

# table model
class TestCase(Base):
    __table= 'test_cases'
    ...
    obsoleted = Column('obsoleted',  Boolean)

Pour obtenir le nombre de tous les cas de test non obsolètes, procédez comme suit:

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

Cela fonctionne bien, mais le flake8 rapporte l'avertissement suivant:

E712: La comparaison avec False doit être "si cond est False:" ou "si pas Cond:"

Ok, je pense que cela a du sens. Alors changez mon code en ceci:

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

ou 

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

Mais aucun d'entre eux ne peut travailler. Le résultat est toujours 0 . Je pense que la clause filter ne prend pas en charge l'opérateur "est" ou "n'est pas". Quelqu'un peut-il me dire comment gérer cette situation? Je ne veux pas désactiver le flocon. 

37
Jruv

En effet, les filtres SQLAlchemy sont l’un des rares endroits où == False a un sens. Partout ailleurs vous devriez pas l'utiliser.

Ajoutez un commentaire # noqa à la ligne et finissez-en.

Ou vous pouvez utiliser sqlalchemy.sql.expression.false :

from sqlalchemy.sql.expression import false

TestCase.obsoleted == false()

false() renvoie la bonne valeur pour votre dialecte SQL de session. Il existe une correspondance sqlalchemy.expression.true .

57
Martijn Pieters

SQL Alchemy propose également des fonctions is_ et isnot que vous pouvez utiliser. Un exemple serait 

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

Plus sur ceux ici

30
avoliva

@Jruv Utilisez # noqa devant une déclaration, il ignorera l'avertissement.

0
user3016020