我在很短的时间内就从使用很多不同线程的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都不会发生这种情况。
我已经用谷歌搜索了这个特定的错误,看来这可能是因为运行查询之前关闭了光标。但是我相信很明显,查询执行后我正在关闭游标。
现在我认为这是由于以下原因造成的:
有想法吗?
答案 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的说明为每个线程打开一个连接。