Python 基础教程

Python 高级教程

Python 相关应用

Python 笔记

Python FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/python-pymysql-err-InterfaceError.html

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)