对于大量行,MySQLdb 的executemany 错误

Mat*_*att 5 python mysql executemany

我当前正在运行一个脚本,使用“执行多个”函数将值(元组列表)插入到 MySQL 数据库中。当我使用少量行(`1000)时,脚本运行良好。

当我使用大约 40,000 行时,我收到以下错误:

cursor.executemany( stmt, trans_frame)
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2538, in run_code
    exec code_obj in self.user_global_ns, self.user_ns
  File "<ipython-input-1-66b44e71cf5a>", line 1, in <module>
    cursor.executemany( stmt, trans_frame)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 253, in executemany
    r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]]))
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 346, in _query
    rowcount = self._do_query(q)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 310, in _do_query
    db.query(q)
OperationalError: (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

unu*_*tbu 3

您可以尝试仅为一个会话设置max_allowed_packet参数:

sql ='SET SESSION max_allowed_packet=500M'
cursor.execute(sql)
sql = ...
args = ...
cursor.executemany(sql, args)
Run Code Online (Sandbox Code Playgroud)

如果这有效,您可以保留代码不变,或者更改 my.cnf 文件(知道这可以解决 executemany 问题)。

  • 谢谢大家的帮助。最后,我无法调整这些全局变量,因为我没有权限。但是,我创建了一个循环来一次插入 500 行,这仍然比仅使用执行语句的循环快得多 (*1000) (2认同)