SQLAlchemy में फ़िल्टर और filter_by के बीच अंतर


304

SQLAlchemy के बीच filterऔर filter_byकार्यों के बीच अंतर को कोई भी समझा सकता है ? मुझे कौन सा उपयोग करना चाहिए?

जवाबों:


393

filter_by का उपयोग किया जाता है, जैसे कि नियमित रूप से kwargs का उपयोग करके कॉलम नामों पर सरल प्रश्नों के लिए

db.users.filter_by(name='Joe')

उसी को पूरा किया जा सकता है filter, न कि क्वार्ग्स का उपयोग करते हुए, बल्कि '==' समानता ऑपरेटर का उपयोग करके, जिसे db.users.name ऑब्जेक्ट पर ओवरलोड किया गया है:

db.users.filter(db.users.name=='Joe')

आप अधिक शक्तिशाली प्रश्नों का उपयोग करके भी लिख सकते हैं filter, जैसे कि भाव:

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))


22
यह हुड के तहत कैसे काम करता है? क्या db.users.name=='Ryan'एक बार निरंतर मूल्यांकन नहीं होगा और तब से निरर्थक होगा? ऐसा लगता है कि किसी को काम करने के लिए एक मेमने का उपयोग करने की आवश्यकता होगी।
हमीश ग्रुबीजन

46
समानता ऑपरेटर अतिभारित है
डैनियल वेलकोव

9
type(model.column_name == 'asdf')sqlalchemy.sql.elements.BinaryExpression
निक टी

11
उपयोग करते समय सावधान रहें .filter। जैसे कोई क्वेरी id=12345, query(users).filter(id == id)फ़िल्टर नहीं करेगा users.id। इसके बजाय, यह सभी उपयोगकर्ताओं के id == idरूप में मूल्यांकन करेगा Trueऔर वापस करेगा । आपको उपयोग करने की आवश्यकता है .filter(users.id == id)(जैसा कि ऊपर डेमो किया गया है)। मैंने आज यह गलती की।
निको सर्नक

118

हम वास्तव में मूल रूप से एक साथ विलय कर चुके थे, अर्थात एक "फ़िल्टर" जैसी विधि थी जिसे स्वीकार किया गया *argsऔर **kwargs, जहाँ आप एक SQL अभिव्यक्ति या कीवर्ड तर्क (या दोनों) पास कर सकते थे। मैं वास्तव में है कि एक बहुत अधिक सुविधाजनक है, लेकिन लोगों को हमेशा के बाद से वे आम तौर पर अभी भी बीच का अंतर खत्म हो गया हो रही है, यह से उलझन में थे column == expressionऔर keyword = expression। इसलिए हमने उन्हें अलग कर दिया।


30
मुझे लगता है कि column == expressionबनाम के बारे में आपकी बात के keyword = expressionबीच अंतर करने के लिए महत्वपूर्ण बिंदु है filterऔर filter_by। धन्यवाद!
हॉलिस्टर

2
मैं sqlalchemy के लिए नया हूँ इसलिए मुझे माफ करना अगर यह एक बेवकूफ सवाल है, लेकिन फ़िल्टर_बाय () "कीमत> = 100" जैसी बहुत ही सरल स्थितियों के लिए भी अनुमति नहीं देता है। तो, क्यों फ़िल्टर_बी () कार्य वैसे भी है, अगर आप केवल "कीमत = 100" जैसी सबसे सरल स्थिति के लिए इसका उपयोग कर सकते हैं?
पावेलरमैन

18
क्योंकि लोग इसे पसंद करते हैं
zzzeek

3
क्या उनके बीच कोई प्रदर्शन अंतर है? मैं सोच रहा था कि filter_byशायद थोड़ी तेजी से हो सकता है filter
देवी

6
उपयोग filter_byकरने का बिंदु उस फ़ील्ड नाम के लिए jut लिखने में सक्षम होना है, उस वर्ग के लिए कोई प्रश्न नहीं पूछा जाता है - जबकि flterवास्तविक कॉलम ऑब्जेक्ट की आवश्यकता होती है - जिसे आमतौर पर कम से कम एक निरर्थक वर्ग नाम टाइप करने के लिए (और पढ़ने के लिए) की आवश्यकता होगी। इसलिए, यदि कोई समानता से फ़िल्टर करना चाहता है, तो यह सुविधाजनक है।
jsbueno

36

filter_byकीवर्ड तर्कों का उपयोग करता है, जबकि filterपाइथोनिक फ़िल्टरिंग तर्कों को अनुमति देता हैfilter(User.name=="john")


34

यह तेज क्वेरी लेखन के लिए एक वाक्यविन्यास चीनी है। स्यूडोकोड में इसका कार्यान्वयन:

def filter_by(self, **kwargs):
    return self.filter(sql.and_(**kwargs))

के लिए और आप बस लिख सकते हैं:

session.query(db.users).filter_by(name='Joe', surname='Dodson')

btw

session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))

के रूप में लिखा जा सकता है

session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))

इसके अलावा आप पीके द्वारा सीधे getविधि के माध्यम से वस्तु प्राप्त कर सकते हैं :

Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)

getमामले का उपयोग करते समय इसके महत्वपूर्ण वस्तु को डेटाबेस अनुरोध के बिना वापस identity mapकिया जा सकता है जिसमें से कैश के रूप में इस्तेमाल किया जा सकता है (लेनदेन के साथ जुड़ा हुआ)


ये कोड उदाहरण भ्रामक हैं: घोषणात्मक आधार तालिका कक्षाएं और उदाहरणों में न तो फ़िल्टर है और न ही क्वेरी विधियाँ; वे सत्र का उपयोग करते हैं।
कछुओं को प्यारा

मैं users.filterपिछले जवाब से पुन: पेश करता हूं । और यह मेरी गलती हो सकती है :) queryविशेषता है query_property और आजकल इसकी एक मानक चीनी
enomad
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.