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.
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