2009-12-11 18 views
20

मेरे Django एप्लिकेशन में, मैं बार-बार अपने डेटाबेस पर एक ही क्वेरी चलाता हूं (उदाहरण के लिए हर 10 सेकंड)। मैं फिर प्राप्त क्वेरीसेट पर एक MD5 योग बनाता हूं और तुलना करता हूं कि मैंने पिछले रन में बनाए गए MD5 योग को तुलना करें। यदि दोनों बराबर हैं, तो डेटा नहीं बदला है और वेब पेज को अद्यतन करने की आवश्यकता नहीं है।Django क्वेरी कैश को अक्षम कैसे करें?

जबकि मैं ऐसा करता हूं, डीबी में डेटा बदल सकता है।

हालांकि, क्वेरी उसी क्वेरीसेट को लौटाती है, जाहिर है query caching के कारण।

मैं क्वेरी कैश को अक्षम कैसे कर सकता हूं और डीबी पर क्वेरी को स्पष्ट रूप से निष्पादित कर सकता हूं?

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/3346124/how-do-i-force- django-to-ignore-any-caches-and-reload-data) –

उत्तर

41

मैं ऐसे व्यवहार में आया जो मैंने सोचा था कि कुछ प्रकार का कैशिंग था, लेकिन यह मुझे बेवकूफ़ बनाते हुए डेटाबेस लेनदेन साबित हुआ।

मैं इस समस्या जहां एक और इस प्रक्रिया में, आइटम डेटाबेस में जुड़ती गया था, और मैं अन्य प्रक्रिया की प्रगति की निगरानी करने के लिए चाहता था, इसलिए मैं एक Django खोल खोल दिया और जारी निम्नलिखित:

>>> MyData.objects.count() 
74674 

>>> MyData.objects.count() 
74674 

मान बदल नहीं रहा था, भले ही यह वास्तव में डेटाबेस में था। मुझे एहसास हुआ कि कम से कम जिस तरह से मेरे पास MySQL & django सेटअप था जो मैं लेनदेन में था और लेनदेन खोले जाने पर डेटाबेस के "स्नैपशॉट" को केवल तभी देखता था।

django में विचारों के साथ, मेरे पास स्वायत्त व्यवहार परिभाषित किया गया था, यह प्रत्येक दृश्य के लिए केवल एक स्नैपशॉट देखने के लिए ठीक था, क्योंकि अगली बार एक दृश्य कहा जाता था क्योंकि यह एक अलग लेनदेन में होगा। लेकिन कोड के एक टुकड़े के लिए जो स्वचालित रूप से नहीं चल रहा था, इस लेनदेन में किए गए लोगों को छोड़कर डीबी में कोई भी बदलाव नहीं दिखाई देगा।

बस सोचा कि मैं इस स्थिति पर आने वाले किसी भी व्यक्ति के लिए इस उत्तर को टॉस करूंगा।

हल करने के लिए, अपने लेन-देन है, जो मैन्युअल रूप से की तरह किया जा सकता है के लिए प्रतिबद्ध:

>> from django.db import transaction 
>> transaction.enter_transaction_management() 
>> transaction.commit() # Whenever you want to see new data 
+2

बहुत बहुत धन्यवाद, मुझे एक कतार सुनने के लिए यह सटीक व्यवहार मिल गया है और कुछ घटनाओं को संसाधित करना चाहिए, जब ऐसा हुआ कि प्रोसेसर – victorcampos

+1

चलाए जाने के बाद बनाए गए उपयोगकर्ताओं को नहीं मिलेगा एक 'banking.commit_unless_managed()' मेरे लिए भी काम किया। –

+1

किसी समस्या के लिए बिल्कुल सही जवाब मैंने अतीत में कई बार परेशान पाया! अनेक अनेक धन्यवाद। – Sarang

6

लिंक आप Django प्रलेखन करने के लिए प्रदान करते हैं मतलब है कि निम्नलिखित:

>>> print [e.headline for e in Entry.objects.all()] 
>>> print [e.pub_date for e in Entry.objects.all()] 

डेटाबेस के लिए दो प्रश्नों बनाता है, जबकि:

>>> queryset = Poll.objects.all() 
>>> print [p.headline for p in queryset] # Evaluate the query set. 
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation. 

क्वेरी कैश का उपयोग करता, जैसा कि आप तक पहुँच रहे हैं एक ही मूल्यांकन के परिणाम।

9

क्वेरी कैशिंग केवल एक क्वेरीसेट के भीतर लागू होती है। दूसरे शब्दों में, यदि आप दो बार एक ही क्वेरीसेट ऑब्जेक्ट का मूल्यांकन करते हैं, तो क्वेरी कैशिंग संचालित होगी। लेकिन अगर आप हर 10 सेकंड में एक प्रश्न कर रहे हैं, तो संभवतः यह एक क्रॉन के माध्यम से होता है जो हर बार एक नई प्रक्रिया पैदा करता है, इसलिए Django कुछ भी कैश नहीं करेगा।

यह संभव है कि आपके डेटाबेस का अपना कैश ऑपरेशन में आ जाएगा यदि आप बार-बार वही क्वेरी कर रहे हैं। आपको अपने डीबीएमएस के लिए प्रलेखन को देखना चाहिए ताकि यह ठीक से प्रबंधित किया जा सके।

+1

सही होने पर, यह सवाल का जवाब नहीं दे रहा है जो स्पष्ट रूप से django क्वेरीसेट पर इंगित करता है। @ केकोआ उत्तर ओपी के सवाल से मेल खाता है। – sberder

1

आपके उत्तरों के लिए बहुत बहुत धन्यवाद, आपके उत्तरों ने मुझे कुछ कदम पीछे ले लिया और पुनर्विचार किया।

डीबीएमएस स्तर पर कैशिंग का परीक्षण करने के लिए, मैं Django से दूर चला गया और एक शेल स्क्रिप्ट का उपयोग किया, मैं किसी भी समय SQLite डीबी से डेटा पूछताछ करने के लिए आसान था, जबकि मैंने दूसरे शेल सत्र में डेटा जोड़ा। नया डेटा आवधिक प्रश्नों में दिखाए जाने के ठीक बाद दिखाया गया, इसलिए यहां कोई क्वेरी कैशिंग नहीं है।

यह इसे Django भाग में संकुचित कर दिया। शामिल कोड बहुत जटिल नहीं है और थोड़ा लॉग आउटपुट और कोड समीक्षा ने समस्या का खुलासा किया है: एमडी 5 योग बनाने के लिए उपयोग की जाने वाली क्वेरीसेट प्राप्त करने के लिए उपयोग की गई क्वेरी में एक त्रुटि थी और हमेशा खाली थी। इसलिए, एमडी 5 योग हमेशा एक ही था। वास्तव में एक कैश किए गए परिणाम की तरह दिखता था - डेटा बदल रहा है, लेकिन क्वेरीसेट वही रहता है। समस्या में अनुप्रयोग नहीं दिखाया गया था, क्योंकि वहां प्रदर्शित डेटा प्राप्त करने के लिए एक अलग क्वेरी का उपयोग किया गया था।

सबक सीखा: यदि आप पूरी तरह से परेशान हैं, तो एक कदम वापस लें और अपनी धारणाओं को फिर से सोचें।

फिर से धन्यवाद! :-)

0

मैं Django संस्करण 1.8 पर इस समस्या से मुलाकात की। ऐसा करने का कोई सीधा तरीका नहीं है, लेकिन कैश के बजाय डीबी तक पहुंचने से क्वेरीसेट को पुनः मूल्यांकन और निष्पादित करने के कुछ तरीके हैं। मैंने इसे Django Queryset Documentation

में पाया, मैंने अपनी समस्या को संभालने के लिए उनमें से एक का उपयोग किया। यह क्वेरीसेट्स का exists() फ़ंक्शन है। len() और repr() का भी उपयोग किया जा सकता है। उन्होंने मेरे लिए भी काम किया।

उदाहरण

queryset = ModelClass.objects.filter(....) 
queryset.exists() 

#or len(queryset) 
#or repr(queryset) 

#Now queryset is re-evaluated. 
की [मैं कैसे मजबूर Django किसी भी कैश ध्यान न दें और डेटा को फिर से लोड करने के लिए करते हैं?] (
संबंधित मुद्दे