"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Why is `flake8` Flagging Boolean Comparisons in SQLAlchemy Filter Clauses?

Why is `flake8` Flagging Boolean Comparisons in SQLAlchemy Filter Clauses?

Publié le 2025-01-31
Parcourir:748

Why is `flake8` Flagging Boolean Comparisons in SQLAlchemy Filter Clauses?

flake8 Flagging Boolean Comparison in Filter Clause

When attempting to filter query results based on a boolean comparison in SQL, developers may encounter warnings from flake8 regarding the use of "==". While it's generally recommended to use "if cond is False:" or "if not cond:" for boolean comparisons elsewhere, this doesn't apply to filter clauses in SQLAlchemy.

In the example provided, a boolean field (obsoleted) in a database table is used to determine the count of non-obsoleted test cases. The code uses TestCase.obsoleted == False in the filter clause.

<pre>caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
</pre>

However, flake8 reports the warning "E712: Comparison to False should be 'if cond is False:' or 'if not cond:'."

To address this warning, developers may be tempted to change the code to use "is False" or "is not" operators:

<pre>caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()
</pre>

or

<pre>caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()
</pre>

Unfortunately, these modifications result in incorrect results, returning 0 instead of the expected count. This is because filter clauses in SQLAlchemy do not support "is" or "is not" operators.

To resolve this issue without disabling flake8, developers can use a # noqa comment on the offending line:

<pre>caseNum = session.query(TestCase).filter(TestCase.obsoleted == False) # noqa: E712
</pre>

Alternatively, the sqlalchemy.sql.expression.false function can be used:

<pre>from sqlalchemy.sql.expression import false

caseNum = session.query(TestCase).filter(TestCase.obsoleted == false())
</pre>

where false() returns the appropriate value for the SQL dialect in use.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3