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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3