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