जवाबों:
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'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
। जैसे कोई क्वेरी id=12345
, query(users).filter(id == id)
फ़िल्टर नहीं करेगा users.id
। इसके बजाय, यह सभी उपयोगकर्ताओं के id == id
रूप में मूल्यांकन करेगा True
और वापस करेगा । आपको उपयोग करने की आवश्यकता है .filter(users.id == id)
(जैसा कि ऊपर डेमो किया गया है)। मैंने आज यह गलती की।
हम वास्तव में मूल रूप से एक साथ विलय कर चुके थे, अर्थात एक "फ़िल्टर" जैसी विधि थी जिसे स्वीकार किया गया *args
और **kwargs
, जहाँ आप एक SQL अभिव्यक्ति या कीवर्ड तर्क (या दोनों) पास कर सकते थे। मैं वास्तव में है कि एक बहुत अधिक सुविधाजनक है, लेकिन लोगों को हमेशा के बाद से वे आम तौर पर अभी भी बीच का अंतर खत्म हो गया हो रही है, यह से उलझन में थे column == expression
और keyword = expression
। इसलिए हमने उन्हें अलग कर दिया।
column == expression
बनाम के बारे में आपकी बात के keyword = expression
बीच अंतर करने के लिए महत्वपूर्ण बिंदु है filter
और filter_by
। धन्यवाद!
filter_by
शायद थोड़ी तेजी से हो सकता है filter
।
filter_by
करने का बिंदु उस फ़ील्ड नाम के लिए jut लिखने में सक्षम होना है, उस वर्ग के लिए कोई प्रश्न नहीं पूछा जाता है - जबकि flter
वास्तविक कॉलम ऑब्जेक्ट की आवश्यकता होती है - जिसे आमतौर पर कम से कम एक निरर्थक वर्ग नाम टाइप करने के लिए (और पढ़ने के लिए) की आवश्यकता होगी। इसलिए, यदि कोई समानता से फ़िल्टर करना चाहता है, तो यह सुविधाजनक है।
filter_by
कीवर्ड तर्कों का उपयोग करता है, जबकि filter
पाइथोनिक फ़िल्टरिंग तर्कों को अनुमति देता हैfilter(User.name=="john")
यह तेज क्वेरी लेखन के लिए एक वाक्यविन्यास चीनी है। स्यूडोकोड में इसका कार्यान्वयन:
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 और आजकल इसकी एक मानक चीनी
db.users.name=='Ryan'
एक बार निरंतर मूल्यांकन नहीं होगा और तब से निरर्थक होगा? ऐसा लगता है कि किसी को काम करने के लिए एक मेमने का उपयोग करने की आवश्यकता होगी।