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


最重要的是: 你如何刷新django中的MySQL连接?

跟着一个 MySQL server has gone away 错误我发现了 MySQL文档 和其他来源(这里)建议增加 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,Python 2.6.6,Win7 64bit


9725
2017-10-20 11:30


起源



答案:


有同样的问题。 我需要了解如何在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

6
2017-10-28 04:00



你如何重新建立连接? - Jonathan


答案:


有同样的问题。 我需要了解如何在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

6
2017-10-28 04:00



你如何重新建立连接? - Jonathan


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

6
2017-08-20 04:49



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


从Django 1.6开始,你可以使用

import django.db

django.db.close_old_connections()

这与adamsmith的答案基本相同,只是它处理多个数据库并且也尊重它 CONN_MAX_AGE 设置。 Django打来电话 close_old_connections() 在每个请求之前和之后自动执行,因此除非在正常的请求/响应周期之外有一些长时间运行的代码,否则通常不必担心它。


0
2017-09-04 13:59