Django - OperationalError :( 2006,'MySQL服务器已经消失')

Jon*_*han 12 mysql django

第一步:你如何刷新django中的MySQL连接?

MySQL server has gone away错误我发现,MySQL文档和其他来源(这里)建议增加wait_timeoutMySQL的参数.对我来说,这似乎是一种解决方法而不是解决方案.我宁愿保持合理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')
Run Code Online (Sandbox Code Playgroud)

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

mix*_*ixo 6

有同样的问题.我需要知道如何在django中检查MySQLdb连接的连接状态.我猜它可以通过实现

try:
    cursor.execute(sql)
catch OperationalError:
    reconnect
Run Code Online (Sandbox Code Playgroud)

有人有更好的主意吗?

UPDATE

我的决定

self.connection.stat()
if self.connection.errno()!=0:
Run Code Online (Sandbox Code Playgroud)

如果错误重新创建连接,请检查mysqldb连接的状态

再次更新

如果连接关闭,您还需要提供服务

if self.connection.open:
    self.connection.stat()
Run Code Online (Sandbox Code Playgroud)

刷新连接只是重新创建它

    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
Run Code Online (Sandbox Code Playgroud)


ada*_*ith 6

解决方案的想法很明确:如果当前连接中断,则重新连接到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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。删除连接对象将导致在下次运行Django查询时重新创建该对象,因此在查询之前运行此功能应确保刷新连接。此外,如果要使用字符串名称删除数据库(如果配置了多个数据库),则可以使用“ del connections._connections .__ dict __ ['default']”。 (2认同)