mysql数据库-5-2-pymysql.err.InterfaceError: (0, ‘‘)解决办法

原因

是因为这个数据库的连接建立太久了,会自动断开,这个时候我们需要重新建立连接,否则访问接口就会出现异常报错了。
导致这个错误的原因是通过pymysql连接MySQL,没有关闭连接的操作,所以短时间内不会出问题,长时间保持这个连接会出现连接混乱。虽然看着自己的代码没错,还是会报
pymysql.err.InterfaceError: (0, ‘’)错误。

ps,但是我在开发环境会频繁断开,估计就是10几分钟就会断开一次,在生产环境就没有这个问题,这让我很疑惑,

解决办法

在知道了问题原因后,我们就需要进行处理了。上面说到MySQL连接时间太长了会断开连接,那么我们可以在每次操作SQL之前对连接进行检查,如果发现连接已经断开,则进行重连。

在 pymysql 创建的数据库连接对象下,有这么一个方法:ping(),直接进去查看源码。
ping源码

    def ping(self, reconnect=True):
        """
        Check if the server is alive.

        :param reconnect: If the connection is closed, reconnect.
        :raise Error: If the connection is closed and reconnect=False.
        """
        if self._sock is None:
            if reconnect:
                self.connect()
                reconnect = False
            else:
                raise err.Error("Already closed")
        try:
            self._execute_command(COMMAND.COM_PING, "")
            self._read_ok_packet()
        except Exception:
            if reconnect:
                self.connect()
                self.ping(False)
            else:
                raise

在源码中,如果使用了该方法 ping(reconnect=True) ,那么可以在每次连接之前,会检查当前连接是否已关闭,如果连接关闭则会重新进行连接,于是我们可以将其用于处理目前报错的问题,改动后的代码如下:

    def select_db(self, sql):
        """查询"""
        # 检查连接是否断开,如果断开就进行重连
        self.conn.ping(reconnect=True)
        # 使用 execute() 执行sql
        self.cur.execute(sql)
        # 使用 fetchall() 获取查询结果
        data = self.cur.fetchall()
        return data

    def execute_db(self, sql):
        """更新/新增/删除"""
        try:
            # 检查连接是否断开,如果断开就进行重连
            self.conn.ping(reconnect=True)
            # 使用 execute() 执行sql
            self.cur.execute(sql)
            # 提交事务
            self.conn.commit()
        except Exception as e:
            print("操作出现错误:{}".format(e))
            # 回滚所有更改
            self.conn.rollback()

面的处理,其实只是在 select_db() 和 execute_db() 中使用 execute() 方法执行sql前,加了一行代码:self.conn.ping(reconnect=True) ,而 self.conn 则是代码里创建的 pymysql 数据库连接对象,我按上述方法处理之后问题得以解决。

posted @ 2023-02-03 17:45  技术改变命运Andy  阅读(2528)  评论(0编辑  收藏  举报