pymysql.err.InterfaceError: (0, '') 对 sql 表进行大量推送时出错

Posted

技术标签:

【中文标题】pymysql.err.InterfaceError: (0, \'\') 对 sql 表进行大量推送时出错【英文标题】:pymysql.err.InterfaceError: (0, '') error when doing a lot of pushes to sql tablepymysql.err.InterfaceError: (0, '') 对 sql 表进行大量推送时出错 【发布时间】:2019-08-17 07:57:57 【问题描述】:

我在很短的时间内从使用许多不同线程的 python 代码(使用 pymysql)对 mysql 表进行了大量插入。

每个线程,其中有很多,最终可能会或可能不会将数据推送到 MySql 表。

这是导致问题的代码块(可以为每个运行的线程调用):

        sql = ("INSERT INTO LOCATIONS (location_id, place_name) VALUES (%s, %s)")
        cursor = self.connection.cursor()          
        cursor.execute(sql, (location_id, place_name))     
        cursor.close()

特别是这一行:

cursor.execute(sql, (location_id, place_name))

导致此错误:

pymysql.err.InterfaceError: (0, '')

还要注意,我在上面块所在的类的 init 中定义了 self.connection。所以所有线程共享一个 self.connection 对象,但得到自己的光标对象。

该错误似乎是随机发生的,并且仅在对 mysql 表进行了多次插入后才开始出现(我认为)。它不一致意味着每次尝试插入 mysql 时都不会发生这种情况。

我已经用谷歌搜索了这个特定的错误,它似乎可能是由于在运行查询之前关闭了光标。但我相信很明显我在执行查询后关闭了光标。

现在我认为这是因为:

    对MySql表的某种写限制,虽然pymysql.err.InterfaceError的错误好像没有具体说这个 事实上,我在高范围定义了一个连接,该连接具有从线程中创建的游标,这可能会导致此问题。

想法?

【问题讨论】:

【参考方案1】:

似乎这个问题与我拥有一个通用连接对象有关。每个线程创建一个似乎已经消除了这个问题。

【讨论】:

【参考方案2】:

我遇到了同样的问题。我的项目代码中有一个全局连接,我发现如果长时间没有mysql操作,这个连接就会超时。由于连接超时,执行sql任务时会出现此错误。

我的解决方案是:在执行sql任务之前重新连接mysql。

    sql = ("INSERT INTO LOCATIONS (location_id, place_name) VALUES (%s, %s)")
    self.connnection.ping()  # reconnecting mysql
    with self.connection.cursor() as cursor:         
        cursor.execute(sql, (location_id, place_name))

【讨论】:

【参考方案3】:

我遇到了同样的错误,我发现 pymysql 是线程安全的,所以你需要像@sometimesiwritecode 所说的那样为每个线程打开一个连接。

来源找到:https://github.com/PyMySQL/PyMySQL/issues/422

【讨论】:

【参考方案4】:

不要关闭连接删除 cursor.close() 行应该继续更新你的数据库

【讨论】:

以上是关于pymysql.err.InterfaceError: (0, '') 对 sql 表进行大量推送时出错的主要内容,如果未能解决你的问题,请参考以下文章