pymysql.err.InterfaceError:(0,'')错误很多时候推到SQL表

时间:2019-03-26 20:13:06

标签: python mysql multithreading pymysql

我在很短的时间内就从使用很多不同线程的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都不会发生这种情况。

我已经用谷歌搜索了这个特定的错误,看来这可能是因为运行查询之前关闭了光标。但是我相信很明显,查询执行后我正在关闭游标。

现在我认为这是由于以下原因造成的:

  1. 对MySql表的某种写限制,尽管pymysql.err.InterfaceError的错误似乎并没有特别说明
  2. 我在高范围内定义了一个连接,该连接具有从线程中创建的游标的事实,这可能会导致此问题。

有想法吗?

4 个答案:

答案 0 :(得分:1)

我遇到同样的问题。我的项目代码中有一个全局连接,如果长时间没有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))

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我遇到了同样的错误,我发现pymysql是线程安全的,因此您需要按照@sometimesiwritecode的说明为每个线程打开一个连接。

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