में MySQLdb का उपयोग कर क्रोनिक स्टाइल परिणाम My Python प्रोग्राम एक MySQL डीबी में टेबल के सेट से पूछताछ करता है, 30 सेकंड के लिए सोता है, फिर उन्हें फिर से पूछताछ करता है। प्रश्नों की तालिका लगातार तीसरे पक्ष द्वारा अपडेट की जाती है, और (जाहिर है) मैं हर 30 सेकंड में नए नतीजे देखना चाहता हूं।पाइथन
मान लीजिए कि मेरी क्वेरी इस तरह दिखता है:
"select * from A where A.key > %d" % maxValueOfKeyFromLastQuery
नियमित रूप से मुझे लगता है कि मेरा कार्यक्रम एक या दो पुनरावृत्तियों के बाद नए परिणाम पाने के बंद हो जाता है देखेंगे, भले ही नई पंक्तियाँ तालिकाओं में मौजूद हैं। मुझे पता है कि टेबल में नई पंक्तियां मौजूद हैं क्योंकि जब मैं इंटरैक्टिव mysql (यानी पायथन से नहीं) से समान क्वेरी जारी करता हूं तो मैं उन्हें देख सकता हूं।
मुझे पता चला कि समस्या प्रत्येक पाइथन में दूर हो जाती है यदि मैं प्रत्येक क्वेरी के बाद डेटाबेस से अपना कनेक्शन समाप्त करता हूं और फिर अगली क्वेरी के लिए एक नया स्थापित करता हूं।
मैंने सोचा कि शायद यह एक सर्वर-साइड संचय मुद्दे के रूप में यहाँ पर चर्चा हो सकती है: Explicit disable MySQL query cache in some parts of program
हालांकि:
जब मैं इंटरैक्टिव mysql खोल जाँच, यह कहना है कि कैशिंग पर है। मैं स्पष्ट रूप से मेरे अजगर कार्यक्रम के भीतर से
SET SESSION query_cache_type = OFF
पर अमल करते हैं (तो अगर यह एक कैशिंग समस्या है, कैसे आ इंटरैक्टिव खोल इससे पीड़ित नहीं करता है?), समस्या अभी भी होती है।
प्रत्येक क्वेरी के लिए एक नया डीबी कनेक्शन बनाना एकमात्र तरीका है जिससे मैं समस्या को दूर करने में सक्षम हूं।
मैं पाइथन से अपने प्रश्न कैसे प्राप्त कर सकता हूं ताकि नए नतीजे देख सकें जो मुझे पता है?
आप उपयोग नहीं करना चाहिए प्रश्नों में '%' प्रारूप ऑपरेटर। सभी प्लेसहोल्डर्स के लिए '% s' का उपयोग करें (कोई फर्क नहीं पड़ता कि उनका प्रकार क्या है) और मूल्यों के साथ एक tuple/सूची पास करें ताकि उन्हें ठीक से sanitized किया जा सके। – ThiefMaster
बस एक अनुमान: सुनिश्चित करें कि डीबी से पढ़े गए आपके प्रश्न लेनदेन द्वारा अन्य परिवर्तनों से अलग नहीं हैं। अर्थात। प्रत्येक पढ़ने से पहले एक नया लेनदेन बनाएँ। – jsw
@ थिफमास्टर: '% d' वास्तव में प्रश्नों में ठीक है, क्योंकि यह प्रतिस्थापन को पूर्णांक होने के लिए मजबूर करता है, जिसे एसक्यूएल इंजेक्शन हमलों के लिए उपयोग नहीं किया जा सकता है। – Jonathan