【问题标题】:Python solving _mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') when using db modelsPython 解决 _mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') when using db models
【发布时间】:2020-06-15 01:36:21
【问题描述】:

所以我们的 python 程序遇到了这些错误_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')。问题是程序访问数据库,在mysql connection timeout ...之后做了很多爬取返回结果,然后为时已晚。

按逻辑有两种解决方案

  • 增加mysql connection timeout 但这不是选项
  • 让 python 检查打开的连接,如果关闭则重新打开它

已经找到了一些解决方案并且听起来很清楚possible solution 和这里about closing and opening cursors

但是我们使用来自 django 的模型 .. 我不知道在哪里实现 check for a connection and reconnect of the connectin is lost 检查的逻辑。

问题:在使用模型时,我可以在哪里以及如何实现所描述的逻辑以重新连接到丢失的数据库连接? (是否有某种 INITCONNECT 事件可供访问)

示例代码

from django.db import models

class Domain(models.Model):
    name = models.CharField(max_length=100)
    domain = models.CharField(max_length=100, blank=True, null=True)

【问题讨论】:

  • 你爬得怎么样?您是否将其作为视图的一部分运行并等待该视图返回,或者以其他方式使用消息队列将任务置于后台,或者可能向诸如 scrapyd 之类的东西发出 RPC?

标签: python python-3.x mysql-python


【解决方案1】:

这是一个无法修复的错误,您可以在 Django docs 中看到 对于解决方法,如果您的程序将长时间闲置,您只需关闭连接即可。

from django.db import connection
# DO SOMETHING TO THE DATABASE
connection.close()

【讨论】:

  • 如果使用 db 模型,我们将如何添加它?例如,我们将定义一个模型并在代码中使用brand = Brand.objects.get(code=spider.brand_code) 调用它
【解决方案2】:

如果你关闭了你的连接,如果需要查询数据库,django会自动重新打开。

因此,如果您知道问题出在某个功能上,无论是否是视图,您都可以在该功能之前或开始时关闭连接:

from django.db import connection 
...
connection.close()

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 2013-12-16
    • 2011-12-11
    • 2012-12-19
    • 2011-02-04
    • 2016-01-19
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多