जवाबों:
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'एक बार निरंतर मूल्यांकन नहीं होगा और तब से निरर्थक होगा? ऐसा लगता है कि किसी को काम करने के लिए एक मेमने का उपयोग करने की आवश्यकता होगी।