Проблема 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-запросы также будут занимать место, просто чтобы быть в безопасности).
Этот подход не очень красив, но он работал для меня безупречно.