2013-09-25 5 views
28

Ho un campo booleano nella tabella db mysql.flake8 si lamenta del confronto booleano "==" nella clausola filtro

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

Per ottenere il conteggio di tutti i casi non obsoleto di prova, che può essere fatto semplicemente in questo modo:

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

Che funziona bene, ma la flake8 riportano il seguente avviso:

E712: Confronto su false dovrebbe essere "if cond è falso:" o "se non cond:"

Ok, penso che abbia senso. Quindi cambiare il mio codice a questo:

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

o

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

Ma nessuno dei due può lavorare. Il risultato è sempre 0. Penso che la clausola del filtro non supporti l'operatore "è" o "non è". Qualcuno può dirmi come gestire questa situazione. Non voglio disabilitare il fiocco.

+0

[PEP 8] (http://www.python.org/dev/peps/pep-0008/#programming-recommendations) specifica in modo specifico * contro * "se cond è False". Sono sorpreso che lo [strumento pep8] (http://pep8.readthedocs.org/en/latest/intro.html) faccia l'opposto. –

risposta

46

Questo perché i filtri SQLAlchemy sono uno dei pochi posti in cui == False ha effettivamente senso. Ovunque si dovrebbe non usarlo.

Aggiungi un commento # noqa alla riga e fallo con esso.

Oppure si può utilizzare sqlalchemy.sql.expression.false:

from sqlalchemy.sql.expression import false 

TestCase.obsoleted == false() 

dove false() restituisce il giusto valore per il vostro dialetto sessione di SQL. C'è un abbinamento sqlalchemy.expression.true.

20

SQL Alchemy ha anche le funzioni is_ e isnot che è possibile utilizzare. Un esempio potrebbe essere

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

More on those here

+1

In Python 'is' e' == 'sono diversi ma sono abbastanza sicuro che l'SQL generato qui sarà lo stesso. – avoliva

+1

'is' e' == 'sono diversi in SQLAlchemy perché non è possibile sovrascrivere l'operatore di identità (' is') in python. Un'espressione come 'Model.column is False' viene sempre valutata come' False' perché il confronto avviene sempre immediatamente in python e non nel database. Il risultato del confronto tra l'identità di un oggetto colonna e un booleano è sempre 'False'. Questo inserisce affermazioni come 'WHERE FALSE' o' AND FALSE' nella tua query, che nella maggior parte dei casi causerà il ritorno di 0 righe indipendentemente da cosa. – Josh

0

@Jruv Usa # noqa davanti dichiarazione, sarà ignorare l'avviso.

Problemi correlati