Flask-sqlalchemy使用MySQL数据库出现错误(2013, 'Lost connection to MySQL server during query')引发单次访问502错误

本文适用于 Flask-SQLAlchemy3.0.x

错误类型:配置错误

报错详细信息

1
2
3
4
5
6
7
8
\[2023-05-11 21:06:26,517\] ERROR in app: Exception on /page/ \[GET\]
Traceback (most recent call last):
[略...]
File "/.../lib/python3.10/site-packages/pymysql/connections.py", line 748, in \_read\_bytes
raise err.OperationalError(
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
The above exception was the direct cause of the following exception:
[引起的其他错误]

解决方式

通过配置pool_recycle参数对超时的连接进行回收。

步骤:

  1. 在数据库中执行SQL语句:show global variables like ‘%timeout%’;
  2. 获取wait_timeout的值(默认3600)
  3. 在flask中(实例化sqlalchemy之前)设置配置:app.config['SQLALCHEMY_ENGINE_OPTIONS']={'pool_recycle':2000}

写在文后

自Flask-SQLAlchemy3.0.x后,大多数可配置项已经失效,例如:

SQLALCHEMY_POOL_TIMEOUT

指定数据库连接池的超时时间。默认是 10。
SQLALCHEMY_POOL_RECYCLE自动回收连接的秒数。这对 MySQL 是必须的,默认 情况下 MySQL 会自动移除闲置 8 小时或者以上的连接。 需要注意地是如果使用 MySQL 的话, Flask-SQLAlchemy 会自动地设置这个值为 2 小时。