2012-03-28 12 views
11

मुझे बड़ी तालिका की सभी पंक्तियों से डेटा पढ़ने की जरूरत है, लेकिन मैं एक ही समय में सभी डेटा को स्मृति में खींचना नहीं चाहता हूं। क्या कोई स्क्लेक्लेमी फ़ंक्शन है जो पेजिंग को संभालेगा? यही है, कई पंक्तियों को स्मृति में खींचें और फिर आवश्यक होने पर और अधिक प्राप्त करें।SQLAlchemy और पेजिंग

मुझे समझ में आता है कि आप limit और offset के साथ this article के साथ ऐसा कर सकते हैं, लेकिन अगर मुझे ऐसा नहीं करना है तो मैं इसे संभालना नहीं चाहूंगा।

उत्तर

13

this answer देखें। संक्षेप में, आप yield_per ऑपरेटर का उपयोग कर सकते हैं।

+0

ऐसा लगता है कि वेबसाइट को प्रस्तुत करने के संदर्भ में पेजिनेशन का समर्थन करता है ... मैं बस डेटाबेस से बात करने की कोशिश कर रहा हूं, कोई अग्रभाग नहीं। –

+0

डेटाबेस परत पर, 'सीमा' और' ऑफ़सेट 'पुनरावृत्ति वास्तव में सबसे उपयुक्त परिदृश्य है, ठीक उसी तरह मूल रूप से प्रलेखित। मेरा मानना ​​है कि यहाँ तर्क यह है कि डेटाबेस _anyway_ के साथ क्या हो रहा है, इस प्रकार, आप अपने स्वयं के 'लूप' भी प्रदान कर सकते हैं। :) – MrGomez

+0

असल में, नहीं, मैं बहुत गलत हूं। मैं अपना जवाब अपडेट कर रहा हूं, क्योंकि मुझे एक और निश्चित संसाधन मिला है। – MrGomez

13

यदि आप फ्लास्क-एसक्लएक्लेमी का उपयोग कर रहे हैं, तो paginatequery की विधि देखें। paginate पेजिनेशन को सरल बनाने के लिए कई विधियों की पेशकश करता है।

record_query = Record.query.paginate(page, per_page, False) 
total = record_query.total 
record_items = record_query.items 

पहले पेज 1 अन्यथा .total रिटर्न अपवाद आप बोतल का उपयोग नहीं कर रहे हैं, तो शून्य

+0

मेरी अन्य टिप्पणियों को अनदेखा करें, यह उत्कृष्ट रूप से काम करता है, मैं सिर्फ एक असंबंधित क्षेत्र में 'dict (** request.args) बेवकूफ कर रहा था और अप्रत्याशित परिणाम प्राप्त कर रहा था। – robru

+0

नहीं, यह अभी भी एक बुरा विचार हो सकता है जैसे कि आप स्रोत को जांचते हैं, वे सीमा और ऑफसेट का उपयोग कर रहे हैं। अब अगर ऑफसेट मान बहुत बड़ा है तो डेटाबेस उन सभी मानों से गुजरता है जिससे प्रदर्शन समस्या उत्पन्न होती है .. –

0

से विभाजित किया जाना चाहिए, आप SQLAlchemy समारोह 'टुकड़ा' या 'सीमा' & की एक कॉम्बो उपयोग कर सकते हैं 'ऑफसेट ', जैसा कि here बताया गया है। उदा .:

some_query = Query([TableBlaa]) 
query = some_query.limit(number_of_rows_per_page).offset(page_number*number_of_rows_per_page) 
# -- OR -- 
query = some_query.slice(page_number*number_of_rows_per_page, (page_number*number_of_rows_per_page)+number_of_rows_per_page) 
current_pages_rows = session.execute(query).fetchall() 
+0

ऑफसेट उच्च है क्योंकि ऑफ़सेट उच्च है क्योंकि यह पिछली पंक्तियों के माध्यम से ऑफसेट की गई पंक्तियों को लाने के लिए है इस प्रकार एक प्रदर्शन समस्या पैदा कर रहा है –