2011-10-20 6 views
10

ボトムラインファースト:djangoでMySQL接続をどのようにリフレッシュしますか?私はMySQL documentationや他のソース(here)はwait_timeout MySQLのパラメータを増やすことを示唆したMySQL server has gone awayエラー後Django - OperationalError:(2006、 '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、Pythonの2.6.6、Win7の64ビット

答えて

6

同じ問題を持ちます。 djangoでMySQLdb接続の接続状態を確認する方法が必要です。 私は、誰もがより良いアイデアを持っている

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

によって達成することができると思いますか?

UPDATEのMySQLdb接続の

私の決定

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

チェック状態エラーが再度

を接続

UPDATEを再作成する場合は、接続がある場合は、ケースを提供する必要があります閉じる

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 connections._connections .__ dict __ ['default']」を使用できます。 – zoidberg

関連する問題