sqlalchemy पूर्ण चयन नहीं है


102

मैं उन एसक्यूएल के रूप में फ़िल्टर कैसे जोड़ सकता हूं जो उन मानों का चयन करने के लिए हैं जो एक निश्चित कॉलम से NULL नहीं हैं?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

मैं SQLAlchemy फ़िल्टर के साथ कैसे कर सकता हूँ?

select = select(table).select_from(table).where(all_filters) 

all_filtersयहाँ क्या है ? क्यों select_from?
मार्टिन पीटर्स

और क्या आपके पास एक तालिका परिभाषा है या क्या आपको कॉलम शाब्दिक का उपयोग करने की आवश्यकता है?
मार्टिन पीटर्स

जवाबों:


136

column_obj != NoneIS NOT NULLबाधा उत्पन्न करेगा :

एक स्तंभ संदर्भ में, खंड का उत्पादन करता है a != b। यदि लक्ष्य है None, एक उत्पादन करता है IS NOT NULL

या उपयोग isnot()(0.7.9 में नया):

IS NOTऑपरेटर को लागू करें ।

आम तौर पर, के IS NOTमूल्य की तुलना करते समय स्वचालित रूप से उत्पन्न होता है None, जो कि हल करता है NULL। हालांकि, IS NOTकुछ प्लेटफार्मों पर बूलियन मूल्यों की तुलना करने पर स्पष्ट उपयोग वांछनीय हो सकता है।

डेमो:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'

8
क्या "कोई नहीं है" एक ही आउटपुट का उत्पादन करता है?
ब्रीजर

21
@ ब्रीजर: नहीं, क्योंकि isकस्टम कक्षाओं द्वारा अतिभारित नहीं किया !=जा सकता है जिस तरह से हो सकता है।
मार्टिन पीटर्स

3
अन्य उत्तर अब पसंदीदा उत्तर है; यह चेतावनियों सहित कई आईडीई को चेतावनी उत्पन्न करने से भी बचाता है।
अंती हापला

@AnttiHaapala: मुझे यकीन नहीं है कि यह 'पसंदीदा' है। SQLAlchemy दस्तावेज़ीकरण एक अधिक महत्वपूर्ण usecase के रूप में बूलियन का उल्लेख करता है। मैंने वह विकल्प जोड़ा है।
मार्टिन पीटर्स

97

संस्करण ०. compar.९ में शुरू, आप .isnotइस तरह की बाधाओं की तुलना करने के बजाय फ़िल्टर ऑपरेटर का उपयोग कर सकते हैं :

query.filter(User.name.isnot(None))

यह विधि केवल तभी आवश्यक है जब pep8 एक चिंता का विषय हो।

स्रोत: sqlalchemy प्रलेखन


5
Pep8 को खुश करने से परे, मुझे लगता है कि यह एक बेहतर समाधान है क्योंकि SQL NULLके RHS के रूप में मान्य नहीं है !=और isnotबेहतर उपयोग करने से आपके इरादे का पता चलता है कि आप उत्पन्न स्टेटमेंट को कैसा देखना चाहते हैं।
जोश

1
@ जोश: SQLAlchemy != NULLहालांकि उत्सर्जन नहीं करेगा , भले ही आप column != Noneपायथन पक्ष पर उपयोग करें ; आपको मिलता है IS NOT NULL। का उपयोग करते हुए .isnot()आप की सुविधा देता है के लिए मजबूर IS NOT लेकिन अन्य प्रकार पर (लगता है .isnot(True)बूलियन कॉलम के खिलाफ, उदाहरण के लिए)।
मार्टिन पीटर्स

43

बाकी मामले किसी को भी सोच रहा है में, आप उपयोग कर सकते हैं is_उत्पन्न करने के लिए foo IS NULL:

>>> sqlalchemy.sql आयात कॉलम से
>>> प्रिंट कॉलम ('फू')। is_ (कोई नहीं)
foo IS NULL है
>>> प्रिंट कॉलम ('फू')। नोट (कोई नहीं)
foo पूरी नहीं है

1
धन्यवाद, यह वही है जो मैं ढूंढ रहा था लेकिन Google ने मुझे यहां भेजा है!
सिंसियर बियर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.