Python 基础教程

Python 高级教程

Python 相关应用

Python 笔记

pymysql 操作数据库报错 raise err.InterfaceError("(0, '')")

Python 操作 MySQL 的各库用法详解 Python 操作 MySQL 的各库用法详解


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)