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. Убедитесь, что разделяете вставку на подходящие по размеру части и что ваша БД настроена для допуска большего размера транзакции, если это необходимо.
Учитывайте, что в разных базах данных могут быть разные ограничения и рекомендации по оптимальному размеру пакета для вставки, поэтому адаптируйте параметры под ваши потребности и возможности базы данных.