python 中,通过 pymysql 操作数据库时,报 raise err.InterfaceError("(0, '')")
错误的原因及解决方法?
异常栈
打印的异常栈如下:
Traceback (most recent call last):
...
File "/xxx/lib/python3.6/site-packages/pymysql/cursors.py", line 165, in execute
result = self._query(query)
File "/xxx/python3/lib/python3.6/site-packages/pymysql/cursors.py", line 321, in _query
conn.query(q)
File "/xxx/python3/lib/python3.6/site-packages/pymysql/connections.py", line 859, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/xxx/python3/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in _execute_command
raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
原因及解决方法
原因
看 pymysql 源码不难发现,该错误表示 pymysql 的连接 socket 已经关闭,即连接不可用。
笔者出现的原因之一是实例化连接对象之后,没有及时进行数据库操作,长时间没有使用连接对象(这里吐槽一下 python 的 mysql 封装类,弱的一逼)。
源码抛出异常代码块:
def _execute_command(self, command, sql):
"""
:raise InterfaceError: If the connection is closed.
:raise ValueError: If no username was specified.
"""
if not self._sock:
raise err.InterfaceError(0, '')
...
解决方法
由于错误原因是数据库的连接建立太久了,会自动断开,需要重新建立数据库的连接。
可以在每次执行 cursor.execute
前,先 ping
一下,如果没 ping 通,那么自动重连,增加如下一行代码:
conn.ping(reconnect=True)