实际的原因在于mysql 设置的timeout大于你的脚本执行时间,导致django的查询超时。
登录mysql可以查看mysql wait_timeout:
SHOW GLOBAL VARIABLES;
django为了减少不必要的数据库连接、关闭,复用了数据库连接,当开始一个请求后建立一个连接池存放连接,之后此次请求都复用一个连接。那猜测就是django保存连接的比wait_timeout长了,如果保存时间短一些就可以重新建立连接避免此错误了。
没错,官方文档也已经说明了此问题,设置数据库 CONN_MAX_AGE参数,示例:
DATABASES = { "default": { 'ENGINE': 'django.db.backends.mysql', 'NAME': '', 'USER': '', 'PASSWORD': '', 'HOST': '', 'CONN_MAX_AGE': 9 # 比wait_timeout小一些 } }
但是有的时候需要执行非常耗时的job,这种方式是行不通的。
解决方案:
再查询之前加入:
django.db.close_old_connections