Каким образом можно сохранить больше 1000 элементов в SQL с использованием Tortoise-ORM?

Как исправить ситуацию, когда из 16500 строк сохраняются только первые 1000 в базу данных?
  • 8 февраля 2024 г. 11:58
Ответы на вопрос 2
Tortoise-ORM – это асинхронный ORM для Python, который поддерживает разные базы данных и базируется на использовании Python 3.7+ с поддержкой асинхронного синтаксиса. Чтобы правильно сохранить большое количество элементов в базу данных с использованием Tortoise-ORM, следует учитывать несколько важных моментов.

Во-первых, SQL базы данных часто имеют настройку, ограничивающую количество элементов, которые можно вставить одной транзакцией. В MySQL, например, есть параметр `max_allowed_packet`, который ограничивает размер пакета данных, и его может потребоваться увеличить.

Чтобы добавить множество записей, можно использовать метод `bulk_create()` в Tortoise-ORM, который предназначен для сохранения большого количества записей более эффективным способом, чем индивидуальное их добавление.

Вот пример того, как использовать `bulk_create`:

```python
from models import YourModel  # Импортируйте модель, которую хотите использовать
from tortoise.transactions import in_transaction

# Список объектов, которые необходимо сохранить
objects_to_create = [YourModel(field1='value1', field2='value2') for _ in range(16500)]

# Разделение списка объектов на части и использование транзакции для каждой части
async def save_in_chunks(objects, chunk_size=1000):
    async with in_transaction() as connection:
        for i in range(0, len(objects), chunk_size):
            chunk = objects[i:i + chunk_size]
            await YourModel.bulk_create(chunk, using_db=connection)

# Запускаем функцию асинхронно для сохранения объектов
await save_in_chunks(objects_to_create)
```

В приведенном выше примере мы разделяем список объектов `objects_to_create` на части по `chunk_size` элементов и сохраняем каждую часть в рамках отдельной транзакции. Это позволяет избежать проблем с ограничениями SQL на размер транзакции и часто повышает производительность вставки данных.

Если вы сталкиваетесь с ограничением в 1000 записей, причина может крыться в настройках самой базы данных или ORM. Убедитесь, что разделяете вставку на подходящие по размеру части и что ваша БД настроена для допуска большего размера транзакции, если это необходимо.

Учитывайте, что в разных базах данных могут быть разные ограничения и рекомендации по оптимальному размеру пакета для вставки, поэтому адаптируйте параметры под ваши потребности и возможности базы данных.
Скорее всего, ограничения на стороне бд, которая не позволяет вставить более 1000 элементов в рамках 1 транзакции, а не с tortoise. 

Если у Вас нет возможности обойти это ограничение, то можно разбить запись на группы по 1000 строк и последовательно повторить запись 16,5 раз.
Похожие вопросы