executemany для ошибки MySQLdb для большого количества строк

В настоящее время я запускаю скрипт для вставки значений (списка кортежей) в базу данных 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')

Какие-либо предложения?


person Matt    schedule 08.11.2012    source источник
comment
проверьте журнал ошибок сервера mysql   -  person Bastian    schedule 08.11.2012
comment
Вы читали этот ответ? Это может быть полезно.   -  person Bakuriu    schedule 08.11.2012
comment
Это похоже на проблему. Я новичок в python и не знаю, как настроить этот параметр в python (max_allowed_packet). какие-либо предложения? Большое спасибо!!   -  person Matt    schedule 08.11.2012
comment
на самом деле я нашел этот файл my.cnf... не уверен, что буду с ним связываться. может просто использовать execute() с циклом, который намного медленнее   -  person Matt    schedule 08.11.2012


Ответы (1)


Вы можете попробовать установить параметр max_allowed_packet только для одного сеанса:

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

Если это сработает, вы можете оставить код как есть или изменить файл my.cnf (зная, что это решает проблему выполнения многих).

person unutbu    schedule 08.11.2012
comment
Спасибо за вашу помощь всем. В конце концов, я не могу настроить эти глобальные переменные, потому что у меня нет разрешения. Тем не менее, я создал цикл для вставки 500 строк за раз, что все равно значительно быстрее (*1000), чем мой цикл только с оператором выполнения. - person Matt; 08.11.2012