Python | peewee.InterfaceError

博客介绍了Python后台因数据库连接失效导致的Peewee.InterfaceError问题。问题表现为服务器每天凌晨无法登录后台,原因是MySQL的wait_timeout设置导致长时间未活动的HTTP请求线程的数据库连接关闭。通过复现问题并使用ReconnectMixin解决,当检测到连接失效时自动重连,从而避免了登录失败的情况。

Python | peewee.InterfaceError

1. 简介

服务器上运行的Python后台,每次到第二天就会出现后台管理账号无法登录情况。查看后台日志发现是数据库方面出现了问题,最先以为是数据库无法访问。因为后台有正在运行的任务,会经常访问数据库发现并没有报数据库方面的错,只有HTTP请求的线程无法访问。

(0, '') <class 'peewee.InterfaceError'>, (0, ''), [<FrameSummary file /flask/router/user.py, line 29 in login>, <FrameSummary file /flask/service/user.py, line 19 in login_user>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 6522 in get>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 6970 in get>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 1918 in inner>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 1989 in execute>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 2162 in _execute>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 3190 in execute>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 3174 in execute_sql>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 2950 in __exit__>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 191 in reraise>, <FrameSummary file /usr/local/lib/python3.10/site-packages/peewee.py, line 3177 in execute_sql>, <FrameSummary file /usr/local/lib/python3.10/site-packages/pymysql/cursors.py, line 148 in execute>, <FrameSummary file /usr/local/lib/python3.10/site-packages/pymysql/cursors.py, line 310 in _query>, <FrameSummary file /usr/local/lib/python3.10/site-packages/pymysql/connections.py, line 547 in query>, <FrameSummary file /usr/local/lib/python3.10/site-packages/pymysql/connections.py, line 793 in _execute_command>]

2. 原因

peewee会为每个线程分配一条数据库链接,当页面长时间没有收到HTTP请求数据操作数据库时,处理HTTP请求的线程的数据库连接就会失效,所有会出现页面无法登录,而后台运行的任务会经常访问数据库,所有连接不会失效。

3. 问题复现

第1步修改数据库wait_timeout时间

让连接更快失效,这里将超时时间设置为3秒。

# 查看数据库wait_timeout
show global variables like 'wait_timeout';

# 设置数据库wait_time
set global wait_timeout=3;

第2步执行测试代码

import time

from peewee import *

db = MySQLDatabase(
    'test',<
docker内报错 File "/ragflow/api/db/services/common_service.py", line 214, in update_by_id num = cls.model.update(data).where(cls.model.id == pid).execute() File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 2011, in inner return method(self, database, *args, **kwargs) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 2082, in execute return self._execute(database) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 2600, in _execute cursor = database.execute(self) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 3299, in execute return self.execute_sql(sql, params) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 3289, in execute_sql with __exception_wrapper__: File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 3059, in __exit__ reraise(new_type, new_type(exc_value, *exc_args), traceback) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 192, in reraise raise value.with_traceback(tb) File "/ragflow/.venv/lib/python3.10/site-packages/peewee.py", line 3291, in execute_sql cursor.execute(sql, params or ()) File "/ragflow/.venv/lib/python3.10/site-packages/pymysql/cursors.py", line 153, in execute result = self._query(query) File "/ragflow/.venv/lib/python3.10/site-packages/pymysql/cursors.py", line 322, in _query conn.query(q) File "/ragflow/.venv/lib/python3.10/site-packages/pymysql/connections.py", line 562, in query self._execute_command(COMMAND.COM_QUERY, sql) File "/ragflow/.venv/lib/python3.10/site-packages/pymysql/connections.py", line 843, in _execute_command raise err.InterfaceError(0, "") peewee.InterfaceError: (0, '')
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值