som*_*ode 10 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()
Run Code Online (Sandbox Code Playgroud)
特别是这一行:
cursor.execute(sql, (location_id, place_name))
Run Code Online (Sandbox Code Playgroud)
这会导致此错误:
pymysql.err.InterfaceError: (0, '')
Run Code Online (Sandbox Code Playgroud)
另请注意,我在上述块所在的类的 init 中定义了 self.connection。因此所有线程共享一个 self.connection 对象,但获得自己的游标对象。
该错误似乎是随机发生的,并且仅在对 mysql 表进行了多次插入后才开始出现(我认为)。它不一致意味着每次尝试插入 mysql 时都不会发生这种情况。
我在谷歌上搜索了这个特定的错误,似乎它可能是由于在运行查询之前关闭了游标。但我相信很明显我在执行查询后关闭了游标。
现在我认为这是因为:
想法?
小智 11
我遇到同样的问题。我的项目代码中有一个全局连接,我发现这个连接如果长时间没有mysql操作就会超时。执行sql任务时会出现此错误,因为连接超时。
我的解决方案是:在执行sql任务之前重新连接mysql。
sql = ("INSERT INTO LOCATIONS (location_id, place_name) VALUES (%s, %s)")
self.connection.ping() # reconnecting mysql
with self.connection.cursor() as cursor:
cursor.execute(sql, (location_id, place_name))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7647 次 |
| 最近记录: |