Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQLdb कनेक्शन संदर्भ प्रबंधक कर्सर को बंद क्यों नहीं करता है?

सीधे आपके प्रश्न का उत्तर देने के लिए:मुझे के साथ . के अंत में बंद करने में कोई नुकसान नहीं दिख रहा है खंड मैथा। मैं यह नहीं कह सकता कि इस मामले में ऐसा क्यों नहीं किया गया। लेकिन, चूंकि इस प्रश्न पर गतिविधि की कमी है, मैंने कोड इतिहास के माध्यम से एक खोज की थी और कुछ विचारों में डालूंगा (अनुमान ) पर क्यों बंद करें () हो सकता है नहीं बुलाया:

  1. nextset() . पर कॉल के माध्यम से घूमने की एक छोटी सी संभावना है एक अपवाद फेंक सकता है - संभवतः इसे देखा गया था और अवांछनीय के रूप में देखा गया था। शायद यही कारण है कि <का नया संस्करण code>cursors.py इस संरचना को close() . में समाहित करता है :

    def close(self):
        """Close the cursor. No further queries will be possible."""
        if not self.connection:
            return
    
        self._flush()
        try:
            while self.nextset():
                pass
        except:
            pass
        self.connection = None
    
  2. वहाँ (कुछ दूर की) संभावना है कि कुछ न किए हुए शेष सभी परिणामों के माध्यम से घूमने में कुछ समय लग सकता है। इसलिए बंद करें () कुछ अनावश्यक पुनरावृत्तियों से बचने के लिए नहीं बुलाया जा सकता है। क्या आपको लगता है कि उन घड़ी चक्रों को सहेजना व्यक्तिपरक है, मुझे लगता है, लेकिन आप "यदि यह आवश्यक नहीं है, तो ऐसा न करें" की तर्ज पर बहस कर सकते हैं।

  3. सोर्सफोर्ज कमिट को ब्राउज़ करते हुए, कार्यक्षमता को इस कमिट द्वारा ट्रंक में जोड़ा गया था 2007 में और ऐसा प्रतीत होता है कि connections.py . का यह खंड तब से नहीं बदला है। यह मर्ज इस कमिट पर आधारित है , जिसमें संदेश है

    और आपके द्वारा उद्धृत कोड तब से कभी नहीं बदला है।

    यह मेरे अंतिम विचार को प्रेरित करता है - यह शायद सिर्फ एक पहला प्रयास/प्रोटोटाइप है जो अभी काम करता है और इसलिए कभी नहीं बदला।

अधिक आधुनिक संस्करण

आप कनेक्टर के लीगेसी संस्करण के लिए स्रोत से लिंक करते हैं। मैंने नोट किया कि एक ही पुस्तकालय का एक अधिक सक्रिय कांटा है यहां , जिसे मैं बिंदु 1 में "नए संस्करण" के बारे में अपनी टिप्पणियों में लिंक करता हूं।

ध्यान दें कि इस मॉड्यूल के नवीनतम संस्करण ने __enter__() implemented को लागू किया है और __exit__() कर्सर . के भीतर स्वयं:यहां देखें . __निकास__() यहाँ करता है कॉल self.close() और शायद यह वाक्य रचना के साथ उपयोग करने के लिए एक अधिक मानक तरीका प्रदान करता है उदा.

with conn.cursor() as c:
    #Do your thing with the cursor

नोट खत्म करें

N.B. एक बार conn का कोई संदर्भ नहीं होने पर मुझे लगता है कि जहां तक ​​मैं कचरा संग्रहण (एक विशेषज्ञ भी नहीं) को समझता हूं, मुझे जोड़ना चाहिए , इसे निस्तारित किया जाएगा। इस बिंदु पर कर्सर ऑब्जेक्ट का कोई संदर्भ नहीं होगा और इसे भी हटा दिया जाएगा।

हालांकि कॉलिंग कर्सर.क्लोज़ () इसका मतलब यह नहीं है कि यह कचरा एकत्र किया जाएगा। यह केवल परिणामों के माध्यम से जलता है और कनेक्शन को कोई नहीं . पर सेट करता है . इसका मतलब है कि इसे फिर से इस्तेमाल नहीं किया जा सकता है, लेकिन यह कचरा तुरंत एकत्र नहीं किया जाएगा। आप मैन्युअल रूप से cursor.close() . पर कॉल करके खुद को इस बारे में आश्वस्त कर सकते हैं आपके साथ . के बाद ब्लॉक करें और फिर कहें, कर्सर . की कुछ विशेषता को प्रिंट करना

नायब 2 मुझे लगता है कि यह साथ . का कुछ असामान्य उपयोग है सिंटैक्स conn . के रूप में ऑब्जेक्ट बनी रहती है क्योंकि यह पहले से ही बाहरी दायरे में है - इसके विपरीत, कहें, अधिक सामान्य open('filename') के रूप में f: के साथ जहां with . के अंत के बाद संदर्भों के साथ कोई वस्तु लटकी हुई नहीं है ब्लॉक करें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संस्थाओं पर परिवर्तन संग्रहीत करना:क्या MySQL उचित समाधान है?

  2. JDBC बैच का उपयोग करके हटाएं और डालें

  3. MySQL मेरे टाइमस्टैम्प मानों को 0000-00-00 . में बदल रहा है

  4. ऐप इंजन से Google क्लाउड एसक्यूएल के लिए कनेक्शन सीमाएं क्या हैं, और डीबी कनेक्शन का सर्वोत्तम पुन:उपयोग कैसे करें?

  5. MYSQL - कॉलम में मान जोड़ें या डालें, इस पर निर्भर करता है कि यह खाली है या नहीं