MySQL 在 python 代码中使用 "executemany" 时服务器已消失
MySQL server has gone away when use "executemany" in python code
我写的这个函数 运行 没有任何错误。
def insertRows(self, query,data):
self.cursor.executemany(query,data)
self.connection.commit()
但是,当我 运行 我的代码在另一台计算机上获取相同数据时出现以下错误。
MySQL Error [2006]: MySQL server has gone away
Traceback (most recent call last):
File "main.py", line 157, in <module>
writePostingLists(lst)
File "main.py", line 32, in writePostingLists
mydb.insertKNNIndex(postingLists,tabelName)
File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 78, in insertKNNIndex
self.insertRows(query,inputList)
File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 31, in insertRows
self.connection.rollback()
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
我发现问题出在我给 executemany 函数的列表长度上。
上面的代码在数据长度小于300的情况下执行没有问题
我该如何解决这个问题?
是不是和MySQl的设置有关?
此处的一个选项是将列表拆分为 100 行左右的行。例如:
def insertRows(self, query,data, LIST_LENGTH=100):
START_INDEX = 0
while data[START_INDEX:START_INDEX+LIST_LENGTH]:
self.cursor.executemany(query,data[START_INDEX:START_INDEX+LIST_LENGTH])
START_INDEX += LIST_LENGTH
self.connection.commit()
我想 mysql(或 mysql-python)可能具有您可以传递给它的数据量的最大字符长度。
关于您的错误(来自 https://piwik.org/faq/troubleshooting/faq_183/):
如果 mysqld 收到一个太大或不正确的数据包,它会假定客户端出现问题并关闭连接。要修复,您可以在 my.cnf
文件中增加最大数据包大小限制 max_allowed_packet
,例如。 set max_allowed_packet = 128M
,然后重新启动您的 MySQL 服务器:sudo /etc/init.d/mysql restart
。
我写的这个函数 运行 没有任何错误。
def insertRows(self, query,data):
self.cursor.executemany(query,data)
self.connection.commit()
但是,当我 运行 我的代码在另一台计算机上获取相同数据时出现以下错误。
MySQL Error [2006]: MySQL server has gone away
Traceback (most recent call last):
File "main.py", line 157, in <module>
writePostingLists(lst)
File "main.py", line 32, in writePostingLists
mydb.insertKNNIndex(postingLists,tabelName)
File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 78, in insertKNNIndex
self.insertRows(query,inputList)
File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 31, in insertRows
self.connection.rollback()
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
我发现问题出在我给 executemany 函数的列表长度上。
上面的代码在数据长度小于300的情况下执行没有问题
我该如何解决这个问题? 是不是和MySQl的设置有关?
此处的一个选项是将列表拆分为 100 行左右的行。例如:
def insertRows(self, query,data, LIST_LENGTH=100):
START_INDEX = 0
while data[START_INDEX:START_INDEX+LIST_LENGTH]:
self.cursor.executemany(query,data[START_INDEX:START_INDEX+LIST_LENGTH])
START_INDEX += LIST_LENGTH
self.connection.commit()
我想 mysql(或 mysql-python)可能具有您可以传递给它的数据量的最大字符长度。
关于您的错误(来自 https://piwik.org/faq/troubleshooting/faq_183/):
如果 mysqld 收到一个太大或不正确的数据包,它会假定客户端出现问题并关闭连接。要修复,您可以在 my.cnf
文件中增加最大数据包大小限制 max_allowed_packet
,例如。 set max_allowed_packet = 128M
,然后重新启动您的 MySQL 服务器:sudo /etc/init.d/mysql restart
。