Проблема SQLAlchemy и max_allowed_packet

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

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



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

1 ответ

Решение

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

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

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

Другие вопросы по тегам