2010-07-26 13 views
37

मैं दो कॉलम कैसे जोड़ूं और फ़िल्टर लागू करूं? उदाहरण के लिए, मैं एक ही समय में "firstname" और "lastname" कॉलम दोनों में खोजना चाहता हूं। यहाँ कैसे मैं इसे कर रहे हैं, तो केवल एक स्तंभ खोज है:sqlalchemy फ़िल्टर एकाधिक कॉलम

query = meta.Session.query(User).filter(User.firstname.like(searchVar)) 
+3

मैंने सोचा था कि इस सवाल का कि मेरे पास इस मुद्दे से मेल खाता है, लेकिन उत्तर मेरे विशेष परिदृश्य पर लागू नहीं होते हैं। यदि पहला नाम "जो" है और अंतिम नाम "स्मिथ" है, तो मैं एक फ़िल्टर स्टेटमेंट की तलाश में हूं जो आपूर्ति करेगा जब आपूर्ति की गई खोज "जो स्मिथ" है। यानी, परीक्षण किए जाने से पहले खेतों को संयोजित (अंतरिक्ष जोड़ा गया) होना चाहिए। एक बहुत ही वास्तविक दुनिया परिदृश्य की तरह लगता है। – Groovee60

+0

@ ग्रूवे 60 यह वही है जो मैं ढूंढ रहा हूं। यदि आप एक पाते हैं, तो आप अपने समाधान को साझा करने में सक्षम होंगे, तो मैं इसकी सराहना करता हूं। – Lilylakshi

उत्तर

42

आप SQLAlchemy के or_ function एक से अधिक स्तंभ में खोज करने के लिए (अंडरस्कोर अजगर के अपने or से अलग करने के लिए आवश्यक है) का उपयोग कर सकते हैं।

यहाँ एक उदाहरण है:

from sqlalchemy import or_ 
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), 
              User.lastname.like(searchVar))) 
+5

आप 'या' के बजाय '|' ऑपरेटर का उपयोग कर सकते हैं, जैसे- '(User.firstname.like (searchVar)) | (User.lastname.like (searchVar)), हालांकि, आपको '|' प्राथमिकता से सावधान रहना चाहिए, बिना किसी अनुबंध के, यह कंप्रेसर ऑपरेटरों के साथ मिश्रित होने पर बहुत अप्रत्याशित परिणाम उत्पन्न कर सकता है। –

+1

यह 'filter.or_ नहीं होना चाहिए (केस 1, केस 2)'? – fedorqui

+1

यह गलत है, क्योंकि प्रश्न ओआरएम के बारे में है लेकिन लिंक अभिव्यक्ति की ओर जाता है। – user2846569

38

आप बस फोन कर सकते हैं filter कई बार:

query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ 
           filter(User.lastname.like(searchVar2)) 
+20

क्या एकाधिक 'फ़िल्टर()' विधियों का उपयोग करने और बड़ी शर्तों के संयोजन ('या_' या' और_' द्वारा) को एक ही 'फ़िल्टर' में बड़े mysql टेबल पर उपयोग करने के बीच कोई प्रदर्शन-अंतर है? – Sangram

+2

क्या एकाधिक 'फ़िल्टर' कॉल 'OR' के बजाय तार्किक' AND' की तरह कार्य करेंगे? – danodonovan

+5

यह होगा और –

10

तरीके यह करने के लिए की संख्या में हैं:

फिल्टर (और ऑपरेटर) का उपयोग करना

query = meta.Session.query(User).filter(
    User.firstname.like(search_var1), 
    User.lastname.like(search_var2) 
    ) 

filter_by (और ऑपरेटर)

query = meta.Session.query(User).filter_by(
    firstname.like(search_var1), 
    lastname.like(search_var2) 
    ) 

श्रृंखलन फिल्टर (और ऑपरेटर)

query = meta.Session.query(User).\ 
    filter_by(firstname.like(search_var1)).\ 
    filter_by(lastname.like(search_var2)) 

का उपयोग करना) or_ का उपयोग करना (या and_() और नहीं()

from sqlalchemy import and_, or_, not_ 

query = meta.Session.query(User).filter(
    and_(
     User.firstname.like(search_var1), 
     User.lastname.like(search_var2) 
    ) 
) 
+0

क्या इन अलग-अलग दृष्टिकोणों के लिए कोई उल्लेखनीय प्रदर्शन अंतर है? – Miek

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