图/文:迷神笔记
很多人在学习python的时候,都会出现pymysql.err.InterfaceError: (0, '') 这个问题,刚好,遇到一个学生的毕业设计也遇到这个问题,项目 Flask+MySQL+pymysql 写了些简单的接口,部署到Linux之后,发现过了一段时间,再次访问接口就不能用了,报错如下:
File "/root/python36/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/root/python36/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/root/python36/lib/python3.6/site-packages/pymysql/connections.py", line 516, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/root/python36/lib/python3.6/site-packages/pymysql/connections.py", line 750, in _execute_command
raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
主要就是上面黑色的部分,翻看了stackoverflow,也有很多遇到,有人已经做了解答:
This is caused by a global cursor. Try creating and closing the cursor within each method a raw query is needed.
You get this error when you have a db.close() call and later try to access the database without creating a new connection. Try to find if you close the connection to the database when you don't mean to.
主要是因为这个数据库的连接建立太久了,会自动断开,这个时候我们需要重新建立连接,否则访问接口就会出现异常报错了。
那怎么解决呢?上面说到MySQL连接时间太长了会断开连接,那么我们可以在每次操作SQL之前对连接进行检查,如果发现连接已经断开,则进行重连。
在python的pymysql里面有一个ping(reconnect=True)方法,那么我们可以在每次连接之前,会检查当前连接是否已关闭,如果连接关闭则会重新进行连接,于是我们可以将其用于处理目前报错的问题,改动后的代码如下:
def select_db(self, sql):
# 检查连接是否断开,如果断开就进行重连
self.conn.ping(reconnect=True)
self.cur.execute(sql)
# 使用 fetchall() 获取查询结果
data = self.cur.fetchall()
return data
就是说执行sql前,加了一行代码:self.conn.ping(reconnect=True) ,而 self.conn 则是代码里创建的 pymysql 数据库连接对象,我按上述方法处理之后问题得以解决。