大量行的 MySQLdb 错误的 executemany

Posted

技术标签:

【中文标题】大量行的 MySQLdb 错误的 executemany【英文标题】:executemany for MySQLdb error for large number of rows 【发布时间】:2012-10-28 19:21:18 【问题描述】:

我目前正在运行一个脚本,使用 execute many 函数将值(元组列表)插入 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')

有什么建议吗?

【问题讨论】:

查看mysql服务器的错误日志 你读过this的答案吗?这可能会有所帮助。 这看起来是个问题。我对 python 比较陌生,不知道如何在 python (max_allowed_pa​​cket) 中调整该参数。有什么建议?非常感谢!! 实际上我发现了 my.cnf 文件...不确定我是否会弄乱它。可能只使用 execute() 和一个慢得多的循环 【参考方案1】:

你可以尝试设置max_allowed_packet参数just for one session:

sql ='SET SESSION max_allowed_packet=500M'
cursor.execute(sql)
sql = ...
args = ...
cursor.executemany(sql, args)

如果可行,您可以保留代码原样,或更改您的 my.cnf 文件(知道这样可以解决 executemany 问题)。

【讨论】:

感谢大家的帮助。最后,我无法调整那些全局变量,因为我没有权限。但是,我创建了一个循环来一次插入 500 行,这仍然比仅使用执行语句的循环快得多(* 1000)【参考方案2】:
sql ='SET GLOBAL max_allowed_packet=500*1024*1024'
cursor.execute(sql)

【讨论】:

以上是关于大量行的 MySQLdb 错误的 executemany的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu中的Python-MySQLdb错误

Python - Mysqldb 安装错误 [错误:命令错误退出状态为 1:]

Python + MySQLdb 执行许多

MySQLdb 错误 1130:未获取服务器的正确 IP [重复]

安装MYSQLdb没有错误,但我无法导入

Python 导入 MySQLdb 错误 - Mac 10.6