2011-10-20 12 views
10

नीचे की रेखा पहले: आप django में MySQL कनेक्शन को रीफ्रेश कैसे करते हैं?Django - OperationalError: (2006, 'MySQL सर्वर चला गया है')

एक MySQL server has gone away त्रुटि के बाद मैंने पाया कि MySQL documentation और अन्य स्रोतों (here) wait_timeout MySQL पैरामीटर बढ़ाने का सुझाव दे। मेरे लिए यह एक समाधान के बजाय एक कामकाज की तरह लगता है। मैं उचित wait_timeout रखूंगा और कोड में कनेक्शन रीफ्रेश करूँगा।

त्रुटि:

File "C:\my_proj\db_conduit.py", line 147, in load_some_model 
    SomeModel.objects.update() 
    File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\models\manager.py", line 177, in update 
    return self.get_query_set().update(*args, **kwargs) 
    File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\models\query.py", line 469, in update 
    transaction.commit(using=self.db) 
    File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\transaction.py", line 142, in commit 
    connection.commit() 
    File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\backends\__init__.py", line 201, in commit 
    self._commit() 
    File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\backends\__init__.py", line 46, in _commit 
    return self.connection.commit() 
OperationalError: (2006, 'MySQL server has gone away') 

सेटअप: Django 1.3.0, MySQL 5.5.14, InnoDB 1.1.8, पायथन 2.6.6, Win7 64 बिट

उत्तर

6

एक ही समस्या हो रही। मुझे डीजेंगो में MySQLdb कनेक्शन के लिए कनेक्शन स्थिति की जांच करने की आवश्यकता है। मैं लगता है कि यह द्वारा

try: 
    cursor.execute(sql) 
catch OperationalError: 
    reconnect 

प्राप्त किया जा सकता किसी को भी एक बेहतर उपाय है है?

अद्यतन

मेरा निर्णय

self.connection.stat() 
if self.connection.errno()!=0: 

जांच mysqldb कनेक्शन की स्थिति यदि त्रुटि को पुन: कनेक्शन

अपडेट फिर

आप भी इस मामले की सेवा के लिए है, तो कनेक्शन है जरूरत

0 बंद करें
if self.connection.open: 
    self.connection.stat() 

ताज़ा कनेक्शन बस इसे

db_settings = settings.DATABASES['mysql_db'] 
    try: 
     self.connection = MySQLdb.connect(host=db_settings['HOST'],port=int(db_settings['PORT']),db=db_settings['NAME'],user=db_settings['USER'],passwd=db_settings['PASSWORD']) 
    except MySQLdb.OperationalError, e: 
     self.connection = None 
+0

आप कनेक्शन कैसे पुन: करते हैं? – Jonathan

5

पुनः है समाधान के विचार स्पष्ट है: mysql से पुन: कनेक्ट करता है, तो वर्तमान कनेक्शन टूट गया है।

इस जांच करें बाहर:

def make_sure_mysql_usable(): 
    from django.db import connection, connections 
    # mysql is lazily connected to in django. 
    # connection.connection is None means 
    # you have not connected to mysql before 
    if connection.connection and not connection.is_usable(): 
     # destroy the default mysql connection 
     # after this line, when you use ORM methods 
     # django will reconnect to the default mysql 
     del connections._connections.default 
+1

यह स्वीकार्य उत्तर होना चाहिए। कनेक्शन ऑब्जेक्ट को हटाने से अगली बार जब एक Django क्वेरी चलती है, तो इसे फिर से बनाया जाएगा, इसलिए एक क्वेरी से पहले इस फ़ंक्शन को चलाने से यह सुनिश्चित होना चाहिए कि कनेक्शन रीफ्रेश हो। इसके अतिरिक्त, यदि आप स्ट्रिंग नाम का उपयोग कर डेटाबेस को हटाना चाहते हैं (यदि आपके पास एक से अधिक डेटाबेस कॉन्फ़िगर किए गए हैं) तो आप "del connection._connections .__ dict __ ['default']" का उपयोग कर सकते हैं। – zoidberg

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