admin管理员组

文章数量:1565790

问题

当sqlalchemy的engine等待一定时间后,再次执行sql,会报Lost connection to MySQL server during query的错误。

准备环境

python3 -m venv venv
source venv/bin/activate
pip install sqlalchemy pymysql

查看本机wait_timeout

mysql> show global variables like 'wait_timeout%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 120   |
+---------------+-------+
1 row in set, 1 warning (0.05 sec)

复现错误

import time

from sqlalchemy.engine import create_engine


url = 'mysql+pymysql://root:root@127.0.0.1:3306/test'
engine = create_engine(url)

query = 'SELECT now();'

while True:
    print('Query-01', engine.execute(query).fetchall())
    engine.execute('SET wait_timeout=3')  # set session variable `wait_timeout`
    time.sleep(5)
    print('Query-02', engine.execute(query).fetchall())
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query 
([WinError 10053] 你的主机中的软件中止了一个已建立的连接。)')

解决方案

设置pool_recycle比wait_timeout小。

import time

from sqlalchemy.engine import create_engine


url = 'mysql+pymysql://root:root@127.0.0.1:3306/test'
engine = create_engine(url, pool_recycle=1)

query = 'SELECT now();'

while True:
    print('Query-01', engine.execute(query).fetchall())
    engine.execute('SET wait_timeout=3')  # set session variable `wait_timeout`
    time.sleep(5)
    print('Query-02', engine.execute(query).fetchall())
Query-01 [(datetime.datetime(2023, 1, 1, 16, 44, 36),)]
Query-02 [(datetime.datetime(2023, 1, 1, 16, 44, 41),)]
Query-01 [(datetime.datetime(2023, 1, 1, 16, 44, 41),)]
Query-02 [(datetime.datetime(2023, 1, 1, 16, 44, 46),)]
Query-01 [(datetime.datetime(2023, 1, 1, 16, 44, 46),)]
Query-02 [(datetime.datetime(2023, 1, 1, 16, 44, 51),)]
Query-01 [(datetime.datetime(2023, 1, 1, 16, 44, 51),)]
Query-02 [(datetime.datetime(2023, 1, 1, 16, 44, 56),)]
...

参考

http://www.ilian.io/sqlalchemy-and-lost-connection-mysql-server-during-query/
https://madmalls/blog/post/sqlalchemy-lost-connection-to-mysql-server-during-query/

本文标签: LostSQLALCHEMYConnectionQueryServer