pymysql.err.InterfaceError: (0, '') error when doing a lot of pushes to sql table

pymysql.err.InterfaceError: (0, '') error when doing a lot of pushes to sql table

我在短时间内从 python 代码(使用 pymysql)对 mysql table 做了很多插入操作不同的线程。

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

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

        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, '')

另请注意,我在上面块所在的 class 的初始化中定义了 self.connection。因此所有线程共享一个 self.connection 对象,但得到它们自己的游标对象。

这个错误似乎是随机发生的,并且只有在 mysql table 中插入了很多次之后才开始出现(我认为)。它不一致意味着它不会在每次尝试插入 mysql.

时发生

我用谷歌搜索了这个特定的错误,看起来它可能是由于游标在 运行 查询之前被关闭所致。但我相信很明显我在执行查询后关闭游标。

现在我认为这是因为:

  1. 对 MySql table 的某种写限制,尽管 pymysql.err.InterfaceError 的错误似乎没有具体说明
  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))

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

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

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