2011-10-20 57 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的Python,Win7的64位

回答

6

有同樣的問題。 我需要想法如何檢查django中MySQLdb連接的連接狀態。 我想它可以通過

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

能夠實現,是任何人有一個更好的主意嗎?

UPDATE

我的決定

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

MySQLdb的連接檢查狀態,如果錯誤重新連接

再次更新

您還需要服務的情況下,如果連接關閉

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查詢運行下一次,所以這個函數運行一個查詢之前應確保連接刷新。此外,如果要刪除使用一個字符串名稱的數據庫(如果您配置了多個數據庫),你可以使用「德爾connections._connections .__字典__ [‘默認’]」。 – zoidberg

相關問題