2009-07-03 13 views
52

मैं चाहूँगा के लिए में query.all क्याSQLAlchemy - क्वेरी के बीच अंतर और पूछने के लिए छोरों

for row in session.Query(Model1): 
    pass 

और

for row in session.Query(Model1).all(): 
    pass 

के बीच का अंतर पहले किसी भी तरह पुनरावर्तक एकल के साथ अपने डीबी बौछार है प्रश्न और बाद वाले "उत्सुक" पूरी चीज को एक सूची के रूप में पूछताछ करते हैं (जैसे श्रेणी (x) बनाम xrange (x))?

उत्तर

73

नहीं, डीबी यातायात में कोई अंतर नहीं है। अंतर यह है कि पूर्व में ओआरएम प्रत्येक पंक्ति पर काम करता है जब यह आपको देने वाला होता है, जबकि दूसरी ओर ओआरएम सभी पंक्तियों पर काम करता है, इससे पहले कि वे आपको देने के लिए शुरू करें।

ध्यान दें कि q.all()list(q) के लिए सिर्फ चीनी है, यानी जेनरेटर द्वारा लिखी गई सभी चीज़ों को एक सूची में एकत्रित करें। यहाँ Query वर्ग (लिंक किए गए स्रोत में def all लगता है) में इसके लिए source code है,:

def all(self): 
    """Return the results represented by this ``Query`` as a list. 

    This results in an execution of the underlying query. 

    """ 
    return list(self) 

... जहां self, क्वेरी वस्तु, एक iterable है, यानि कि एक __iter__ विधि है।

तो तर्कसंगत रूप से डीबी यातायात के मामले में दो तरीके बिल्कुल समान हैं; एक पंक्ति इटेटरेटर प्राप्त करने के लिए दोनों query.__iter__() को कॉल करना, और next() इसके माध्यम से अपना रास्ता तय करना।

व्यावहारिक अंतर यह है कि पूर्व आपकी डेटा पहुंचने के तुरंत बाद आपको पंक्तियां देना शुरू कर देता है, डीबी परिणाम आपको स्ट्रीमिंग "कम स्मृति उपयोग और विलंबता के साथ सेट करता है। मैं यह सुनिश्चित नहीं कर सकता कि सभी मौजूदा इंजन कार्यान्वयन ऐसा करते हैं (मुझे उम्मीद है कि वे करते हैं!)। किसी भी मामले में बाद वाला संस्करण किसी भी अच्छे कारण के लिए उस दक्षता को रोकता है।

+0

धन्यवाद, यह एक उत्कृष्ट उत्तर – Tom

+9

[यह पोस्ट] है (http://www.mail-archive.com/[email protected]/msg12443.html) कार्यान्वयन विवरण पर कुछ प्रकाश डालता है। संक्षिप्त उत्तर: '__iter__' * * सभी परिणामों को prefetch (अच्छे कारण के लिए), लेकिन यदि आप जानते हैं कि आप क्या कर रहे हैं तो यह व्यवहार बदला जा सकता है। – Coquelicot

+0

तो 'q.all()' का उपयोग करने में कोई फायदा नहीं है? – dshgna

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