2013-09-25 16 views
28

Ich habe ein boolesches Feld in der mysql-db-Tabelle.flocke8 beschwert sich über booleschen Vergleich "==" in Filterklausel

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

Das funktioniert gut, aber die folgende Warnung flake8 berichten:

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

Um die Anzahl aller nicht-veralteten Testfälle zu bekommen, das kann einfach so getan wird

E712: Vergleich auf false sollte "wenn cond falsch ist:" oder "wenn nicht Ltg:"

Okay, ich denke das macht Sinn. So meinen Code dies ändern:

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

oder

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

Aber keiner von ihnen arbeiten können. Das Ergebnis ist immer 0. Ich denke, die Filterklausel unterstützt nicht den Operator "ist" oder "ist nicht". Kann mir jemand sagen, wie ich mit dieser Situation umgehen soll? Ich möchte den Flake nicht deaktivieren.

+0

[PEP 8] (http://www.python.org/dev/peps/pep-0008/#programming-recommendations) rät ausdrücklich * gegen * "wenn cond ist False". Ich bin überrascht, dass das [pep8-Tool] (http://pep8.readthedocs.org/en/latest/intro.html) das Gegenteil tut. –

Antwort

46

Das ist, weil SQLAlchemy Filter einer der wenigen Orte sind, wo == False tatsächlich sinnvoll ist. Überall sonst sollten Sie nicht verwenden.

Fügen Sie einen # noqa Kommentar zur Zeile hinzu und machen Sie damit fertig.

Oder Sie können sqlalchemy.sql.expression.false verwenden:

from sqlalchemy.sql.expression import false 

TestCase.obsoleted == false() 

wo false() den richtigen Wert für Ihre Sitzung SQL-Dialekt zurückgibt. Es gibt eine passende sqlalchemy.expression.true.

20

SQL Alchemy hat auch is_ und isnot Funktionen, die Sie verwenden können. Ein Beispiel wäre

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

More on those here

+1

In Python 'is' und' == 'sind verschieden, aber ich bin mir ziemlich sicher, dass das SQL, das hier erzeugt wird, dasselbe sein wird. – avoliva

+1

'is' und' == 'sind in SQLAlchemy anders, weil Sie den Identity-Operator (' is') in Python nicht überschreiben können. Ein Ausdruck wie 'Model.column is False' wird immer als' False' gewertet, da der Vergleich immer sofort in Python und nicht in der Datenbank erfolgt. Das Ergebnis des Vergleichs der Identität eines Spaltenobjekts mit einem booleschen Wert ist immer 'Falsch'. Dies fügt Anweisungen wie 'WHERE FALSE' oder' AND FALSE' in Ihre Abfrage ein, die in den meisten Fällen dazu führt, dass es immer 0 Zeilen zurückgibt. – Josh

0

@Jruv Verwenden # noqa vor Aussage, es wird die Warnung ignorieren.

Verwandte Themen