2010-07-16 3 views
0

В связи с природой моего приложения мне необходимо поддерживать быстрые вставки больших объемов данных в базу данных. Использование функции executemany() повышает производительность, но есть оговорка. Например, MySQL имеет параметр конфигурации max_allowed_packet, и если общий размер моих запросов на вставку превышает его значение, MySQL выдает ошибку.Проблема SQLAlchemy и max_allowed_packet

Вопрос №1: Есть ли способ сказать SQLAlchemy разбить пакет на несколько более мелких?
Вопрос №2: Если другие RDBS имеют схожие ограничения, как мне их обойти?



P.S. Я опубликовал этот вопрос раньше, но удалил его, когда ошибочно предположил, что, скорее всего, я не буду сталкиваться с этой проблемой. К сожалению, это не так.

ответ

1

У меня была аналогичная проблема недавно и используется - не очень элегантно - обходным:

  • Сначала я разобран my.cnf для значения для max_allow_packets, если я не могу найти его, максимум установлен на значение по умолчанию.
  • Все элементы данных хранятся в списке.
  • Далее, для каждого элемента данных я подсчитываю приблизительную длину байта (со строками, это длина строки в байтах, для других типов данных я беру максимальные байты, которые должны быть безопасными.)
  • Я добавляю их , совершая после того, как я достиг ок. 75% от max_allow_packets (так как SQL-запросы занимают также место, просто чтобы быть в безопасности).

Этот подход не очень красив, но для меня он работал безупречно.

+0

Звучит хорошо, хотя есть два нюанса. Во-первых, значение max_allowed_packet, возможно, было задано командой, выданной DBA, а не в файле конфигурации, поэтому я думаю, что я скорее сделаю 'select @@ max_allowed_packet'. Во-вторых, знаете ли вы, нужны ли какие-либо другие базы данных, такие как Postgres или Oracle, аналогичные обходные пути? – dpq

+0

Вы правы, '' select'' - это способ сделать это правильно. Как и в Postgres или Oracle, у меня нет опыта работы с этими базами данных, но быстрый Googling дал http://www.mail-archive.com/[email protected]/msg71116.html, поэтому я предполагаю, что По крайней мере, Postgres не имеет этого ограничения, но я могу ошибаться. – PhilS

Смежные вопросы