2011-10-20 22 views
10

Alt satır ilk: Django'daki MySQL bağlantısını nasıl yeniliyorsunuz?Django - OperationalError: (2006, 'MySQL sunucusu kayboldu')

bir MySQL server has gone away hata izlenerek ve MySQL documentation ve diğer kaynaklar (here) wait_timeout MySQL parametresini arttırarak göstermektedir bulundu. Bana göre bu bir çözüm yerine bir çözüm gibi görünüyor. Makul bir wait_timeout tutmayı ve koddaki bağlantıyı yenilemeyi tercih ederim.

hatası:

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') 

Kurulumu: Django 1.3.0, MySQL 5.5.14, innodb 1.1.8, Python 2.6.6, Win7 64bit

cevap

6

aynı sorunu olan. Django'da MySQLdb bağlantısı için bağlantı durumunun nasıl kontrol edileceğine dair bir fikre ihtiyacım var. ben herkes daha iyi bir fikir olduğunu

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

sağlanabilir tahmin? mysqldb bağlantısının

GÜNCELLEME

kararım

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

onay devlet hatası yeniden eğer bağlantısı

GÜNCELLEME TEKRAR da bağlantı ise davayı hizmet etmek gerek

kapat

if self.connection.open: 
    self.connection.stat() 

yenileme bağlantısı sadece çözüm fikri o

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

nasıl bağlantı yeniden do? – Jonathan

5

yeniden yaratmaktır net: mevcut bağlantı kesilirse mysql yeniden bağlayın.

bu göz atın:

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

Bu kabul edilen cevap olmalı. Bağlantı nesnesini silmek, bir sonraki Django sorgusu çalıştırıldığında yeniden oluşturulmasına neden olur; bu nedenle, bir sorgulamadan önce bu işlevi çalıştırmak, bağlantının yenilenmesini sağlamalıdır. Ayrıca, bir dize adı kullanarak veritabanını silmek istiyorsanız (birden çok veritabanı yapılandırılmışsa) "del connections._connections .__ dict __ ['default']" komutunu kullanabilirsiniz. – zoidberg

İlgili konular