2013-09-25 7 views
28

मेरे पास mysql डीबी तालिका में एक बूलियन फ़ील्ड है।फ्लैक 8 बूलियन तुलना पर शिकायत करता है "==" फ़िल्टर क्लॉज में

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

सभी गैर obsoleted परीक्षण मामलों की गिनती करने के लिए, कि इस तरह बस किया जा सकता है:

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

कि ठीक काम करता है, लेकिन निम्न चेतावनी रिपोर्ट flake8:

E712: झूठे से तुलना किया जाना चाहिए "अगर cond झूठी है:" या "नहीं करता है, तो शर्तः"

ठीक है, मुझे लगता है कि समझ में आता है। तो यह करने के लिए अपने कोड बदलने के लिए:

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

या

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

लेकिन उनमें से कोई भी काम कर सकते हैं। नतीजा हमेशा 0. मुझे लगता है कि फ़िल्टर क्लॉज ऑपरेटर "है" या "नहीं है" का समर्थन नहीं करता है। क्या कोई मुझे बता सकता है कि इस स्थिति को कैसे संभाला जाए। मैं फ्लेक को अक्षम नहीं करना चाहता हूं।

+0

[पीईपी 8] (http://www.python.org/dev/peps/pep-0008/#programming-recommendations) विशेष रूप से * * अगर कोड गलत है "के खिलाफ * सलाह देता है। मुझे आश्चर्य है कि [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() रिटर्न अपने सत्र एसक्यूएल बोली के लिए सही मूल्य। एक मिलान sqlalchemy.expression.true है।

20

एसक्यूएल कीमिया में is_ और isnot फ़ंक्शन भी आप उपयोग कर सकते हैं। एक उदाहरण

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

More on those here

+1

पायथन 'है' और '== 'अलग हैं लेकिन मुझे पूरा यकीन है कि यहां जेनरेट किया जा रहा एसक्यूएल वही होगा। – avoliva

+1

'is' और' == 'SQLAlchemy में अलग हैं क्योंकि आप पाइथन में पहचान ऑपरेटर (' is') को ओवरराइड नहीं कर सकते हैं। 'Model.column' False' जैसी अभिव्यक्ति हमेशा 'गलत' के रूप में मूल्यांकन की जाती है क्योंकि तुलना हमेशा पाइथन में होती है और डेटाबेस नहीं होती है। कॉलम ऑब्जेक्ट और बुलियन की पहचान की तुलना करने का नतीजा हमेशा 'गलत' होता है। यह आपकी क्वेरी में 'कहां गलत' या 'और गलत 'जैसे बयान दर्ज करता है, जो ज्यादातर मामलों में 0 पंक्तियों को वापस करने का कारण बनता है इससे कोई फर्क नहीं पड़ता। – Josh

0

बयान के सामने @Jruv उपयोग # noqa, यह चेतावनी पर ध्यान नहीं देंगे।

संबंधित मुद्दे