直奔主题吧!

情况

python写的机器人遇到了一个mysql的错误 pymysql.err.InterfaceError: (0, '')

完整报错内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Traceback (most recent call last):
File "/home/mu/pybot/vshop-bot/poxiao-bot/main.py", line 402, in user_active_on_msg
user_log = await Store.create_user_log(guild_id=gid, user_id=uid)
File "/home/mu/pybot/vshop-bot/poxiao-bot/utils/Store.py", line 313, in create_user_log
user = await QueryMysql.insert_user_log(guild_id, user_id)
File "/home/mu/pybot/vshop-bot/poxiao-bot/utils/data/QueryMysql.py", line 292, in insert_user_log
user = await query_user_log(guild_id, user_id)
File "/home/mu/pybot/vshop-bot/poxiao-bot/utils/data/QueryMysql.py", line 283, in query_user_log
return await UserLog.query(guild_id, user_id)
File "/home/mu/pybot/vshop-bot/poxiao-bot/utils/data/QueryMysql.py", line 21, in query
cursor.execute(MysqlSql.Select.UserLogGU, (guild_id, user_id))
File "/home/mu/pybot/vshop-bot/vs-venv/lib/python3.10/site-packages/pymysql/cursors.py", line 153, in execute
result = self._query(query)
File "/home/mu/pybot/vshop-bot/vs-venv/lib/python3.10/site-packages/pymysql/cursors.py", line 322, in _query
conn.query(q)
File "/home/mu/pybot/vshop-bot/vs-venv/lib/python3.10/site-packages/pymysql/connections.py", line 557, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/home/mu/pybot/vshop-bot/vs-venv/lib/python3.10/site-packages/pymysql/connections.py", line 840, in _execute_command
raise err.InterfaceError(0, "")
pymysql.err.InterfaceError: (0, '')

百度

百度了,说是不要在数据库链接关闭后使用数据库。

比如下面的代码就是有问题的,close之后相当于你已经没有连上数据库了。这时候再commit肯定是不行的。就好比断网了再点击网页刷新按钮,是无济于事的!

1
2
3
4
db = "数据库连接"
# 数据库操作
db.close()
db.commit()

咋回事?

然后呢,我还看到了一些博客提到了需要检查连接是否可用。还有其他的巴拉巴拉的。吓得我以为自己的代码是不是有什么问题,是不是这个报错只要跑久了就一定会出现?

直到我想起来我操作过docker的iptables,重启过docker(我的mysql是docker搭建的)

咳咳,数据库重启过,难怪连不上。怪我怪我。

也提醒下大家,一定要先把需要用数据库的进程都给停了再去重启数据库!

QQ图片20220419103148

另外,我还发现如果一个python进程链接数据库很久却啥事没干也会被mysql中断链接,从而造成这个报错。

考虑到kook机器人的用量问题,其实sqlite这种轻量级数据库更加适合机器人。