2013-09-25 40 views
28

我在mysql數據庫表中有一個布爾型字段。flake8抱怨過濾器子句中的布爾比較「==」

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

要獲得所有非過時的測試案例的數量,可以簡單地做過這樣的:

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

這工作正常,但flake8報告如下警告:

E712:比較爲False應該是 「如果cond爲假:」 或 「如果不是 COND:」

好的,我認爲這是有道理的。所以,我的代碼改成這樣:

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

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

但他們都沒有能正常工作。結果始終爲0. 我認爲filter子句不支持運算符「is」或「is not」。有人會告訴我如何處理這種情況。我不想停用片狀物。

+0

[PEP 8](http://www.python.org/dev/peps/pep-0008/#programming-recommendations)特別建議*反對*「如果cond爲False」。我很驚訝,[pep8工具](http://pep8.readthedocs.org/en/latest/intro.html)恰恰相反。 –

回答

46

這是因爲SQLAlchemy過濾器是== False實際上有意義的少數幾個地方之一。 其他地方你應該不是使用它。

添加一條# noqa評論到該行並完成它。

或者你可以使用sqlalchemy.sql.expression.false

from sqlalchemy.sql.expression import false 

TestCase.obsoleted == false() 

其中false()返回會話SQL方言的權值。有一個匹配的sqlalchemy.expression.true

20

SQL Alchemy還有is_isnot函數可以使用。一個例子是

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

More on those here

+1

在Python中'is'和'=='是不同的,但我很確定這裏生成的SQL將是相同的。 – avoliva

+1

'is'和'=='在SQLAlchemy中是不同的,因爲你不能在Python中重載身份運算符('is')。像「Model.column是False」這樣的表達式總是被評估爲「False」,因爲比較總是立即在python中發生,而不是在數據庫中發生。比較列對象和布爾值的標識結果始終爲「False」。這會在您的查詢中插入'WHERE FALSE'或'AND FALSE'等語句,在大多數情況下,無論如何都會導致它返回0行。 – Josh

0

@Jruv使用# noqa在聲明的前面,它會忽略警告。