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 timefrom peewee import *db = MySQLDatabase('test',user='root',password='12345678',host='127.0.0.1',port=3306,
)class User(Model):username = CharField()password = CharField()salt = CharField()state = SmallIntegerField()class Meta:database = dbdb.create_tables([User])query = User.select()
ls = [user.username for user in query]time.sleep(5)
query = User.select()
ls = [user.username for user in query]

执行结果

Traceback (most recent call last):File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 3177, in execute_sqlcursor.execute(sql, params or ())File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/cursors.py", line 148, in executeresult = self._query(query)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/cursors.py", line 310, in _queryconn.query(q)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 548, in queryself._affected_rows = self._read_query_result(unbuffered=unbuffered)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 775, in _read_query_resultresult.read()File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 1156, in readfirst_packet = self.connection._read_packet()File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 701, in _read_packetraise err.OperationalError(
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/Users/yimt/Code/PycharmProjects/hello-python/work.py", line 31, in <module>ls = [user.username for user in query]File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 6960, in __iter__self.execute()File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 1918, in innerreturn method(self, database, *args, **kwargs)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 1989, in executereturn self._execute(database)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 2162, in _executecursor = database.execute(self)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 3190, in executereturn self.execute_sql(sql, params, commit=commit)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 3174, in execute_sqlwith __exception_wrapper__:File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 2950, in __exit__reraise(new_type, new_type(exc_value, *exc_args), traceback)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 191, in reraiseraise value.with_traceback(tb)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/peewee.py", line 3177, in execute_sqlcursor.execute(sql, params or ())File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/cursors.py", line 148, in executeresult = self._query(query)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/cursors.py", line 310, in _queryconn.query(q)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 548, in queryself._affected_rows = self._read_query_result(unbuffered=unbuffered)File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 775, in _read_query_resultresult.read()File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 1156, in readfirst_packet = self.connection._read_packet()File "/Users/yimt/Code/PycharmProjects/hello-python/venv/lib/python3.10/site-packages/pymysql/connections.py", line 701, in _read_packetraise err.OperationalError(
peewee.OperationalError: (2013, 'Lost connection to MySQL server during query')

4. 解决方法

使用ReconnectMixin,当发现数据库连接失效时会自动重新连接。

import timefrom playhouse.shortcuts import ReconnectMixin
from peewee import *class ReconnectMySQLDatabase(ReconnectMixin, MySQLDatabase):passdb = ReconnectMySQLDatabase('test',user='root',password='12345678',host='127.0.0.1',port=3306,
)class User(Model):username = CharField()password = CharField()salt = CharField()state = SmallIntegerField()class Meta:database = dbdb.create_tables([User])query = User.select()
ls = [user.username for user in query]time.sleep(5)
query = User.select()
ls = [user.username for user in query]

5. 参考

  • github-issues-#1546

Python | peewee.InterfaceError相关推荐

  1. python peewee 批量插入

    百度这是个什么玩意,查个东西真难,自己记录下 peewee 使用 insert_many 进行批量插入 insert_many(rows, fields=None) data_source = [{' ...

  2. python peewee库 和 sqlite3的使用

    python3.6 peewe库 和 sqlite3的使用[笔记] 采用一整段代码作为笔记内容 且重要操作内容已经使用注释进行标记 from peewee import * from datetime ...

  3. peewee flask pwiz 中使用模型 过一段时间报错 peewee.InterfaceError: (0, '') 的解决方式

    https://www.cnblogs.com/lajiao/p/10434501.html

  4. 视频教程-Python入门精讲视频,从入门到精通-Python

    Python入门精讲视频,从入门到精通 10年Linux使用及管理经验,7年IT在线教育培训经验.拥有RHCA高级架构师及Openstack证书.精通Linux.Python.思科.C++.安全渗透等 ...

  5. pythonsqlite导出json_使用 Python 的 SQLite JSON1 和 FTS5 扩展

    早在九月份,编程界出现一个名为 json1.c 的文件,此前这个文件一直在 SQLite 的库里面.还有,笔者也曾总结通过使用新的 json1 扩展来编译 pysqlite 的技巧.但现在随着 SQL ...

  6. vnpy 查询持仓量_vn.py 数据入库

    如何编写一个python脚本将本地.csv 文件导入数据库是vn.py论坛中新用户提问较多的问题之一.本文的主要目的是帮助新用户解决数据入库问题,以便用户可以快速进入量化策略的开发. 本文主要分为三大 ...

  7. Flask-peewee-pyjwt实现简单的用户接口

    目录 前言 一.需求 二.轻量级ORM-peewee 一.导入模块 二.初始化数据库 三.创建model 四.基本方法 1.增 2 查询 3修改 4删除 三.pyjwt的使用 一.什么是jwt 二.j ...

  8. python安装orm_Python ORM框架之 Peewee入门

    之前在学Django时,发现它的模型层非常好用,把对数据库的操作映射成对类.对象的操作,避免了我们直接写在Web项目中SQL语句,当时想,如果这个模型层可以独立出来使用就好了,那我们平台操作数据库也可 ...

  9. python解析数据包时出现问题_MySQL Connector / Python InterfaceError:“解析EOF数据包失败”...

    据我所知,我已经安装了MySQL Connector / Python(v1.2.3)模块没有问题 . 这是在CentOS 5.4上使用Python 2.7.7(Anaconda发行版,尽管在vani ...

最新文章

  1. 使用存储过程更新数据库!成功了但是返回值为 -1 的变态问题的解决办法!
  2. 拿下斯坦福和剑桥双offer,00后的算法学习之路
  3. mysql性能优化学习笔记-存储引擎
  4. Spring 中的代理选择原则
  5. 文件共享服务器地址格式,文件共享服务器配置
  6. ssh 配置:在 Linux 中 ssh 配置无密码登陆完整步骤以及易错点分析
  7. spring3的JAR包与注解学习笔记
  8. %%%%%%%%123564
  9. PPT要怎么做?需掌握的一些制作设计技巧
  10. 求圆周长,圆面积,圆球表面积、圆球体积,圆柱体积
  11. 日期抽象数据类型设计与实现作业总结
  12. 吉他图形c语言代码,民谣吉他琴颈形状示意图(U型、V型、C型等)
  13. 2017年6月英语 CET 四六级考试查询准考证方法
  14. jxls-1.0支持excel2003及excel2007版本
  15. 经典动画《大闹天宫》4K 版上映,老动画是如何修复的?
  16. 计算机文档里的圆圈,电脑怎么打出圆圈符号?利用word或者输入法打出圆圈的方法介绍...
  17. python怎么分行读取txt文件_python怎么读取txt文件内容
  18. 计算机英语广播,计算机专业英语词汇7-英语文章阅读-大耳朵英语 - 免费在线英语学习 口语练习 四级听力资料 在线翻译 网络课堂 英语社区...
  19. 算法刷题-钥匙与房间
  20. 中国计算机应用大会EI检索吗,国内EI检索的期刊有哪些?(计算机、信息方向)...

热门文章

  1. 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
  2. 利盟 x466 双面打印问题之正反面颠倒
  3. 地表最强的GPT-3,是在推理,还是胡言乱语?
  4. 游戏‘微信打飞机’ 第三课
  5. android调用截屏功能,调用安卓原生的截图功能
  6. 高通AP侧新增AT命令流程
  7. mocc javascript
  8. web scraper翻页功能的实现
  9. 由NPLM到Word2vec
  10. 物联网卡和流量卡相比哪个信号强