← Назад к вопросам

Что такое Tortoise ORM?

1.7 Middle🔥 191 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Tortoise ORM

Tortoise ORM — это асинхронная ORM (Object-Relational Mapping) для Python, предназначенная для работы с базами данных в асинхронных приложениях. Она особенно популярна в экосистеме асинхронных фреймворков, таких как FastAPI, Starlette и Quart.

Основные особенности Tortoise ORM

Асинхронность — полная поддержка async/await:

  • Все операции с БД выполняются асинхронно
  • Не блокирует event loop
  • Идеальна для высоконагруженных приложений

Поддержка нескольких БД:

  • PostgreSQL
  • MySQL/MariaDB
  • SQLite
  • Oracle (экспериментальная поддержка)

Инструменты разработки:

  • Миграции (Aerich)
  • Админ-панель
  • Автоматическая генерация документации

Установка и первоначальная настройка

# Установка
# pip install tortoise-orm
# pip install aerich  # для миграций

from tortoise import Tortoise, fields
from tortoise.models import Model

# Инициализация
async def init():
    await Tortoise.init(
        db_url='sqlite://:memory:',
        modules={'models': ['myapp.models']}
    )
    await Tortoise.generate_schemas()

Определение моделей

from tortoise import fields
from tortoise.models import Model

class User(Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=100, unique=True)
    email = fields.CharField(max_length=255)
    is_active = fields.BooleanField(default=True)
    created_at = fields.DatetimeField(auto_now_add=True)
    
    # Meta информация
    class Meta:
        table = "users"
        
    def __str__(self):
        return self.username

Связи между моделями

class Category(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=100)

class Product(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255)
    # Foreign Key
    category = fields.ForeignKeyField('models.Category', related_name='products')
    # Many-to-Many
    tags = fields.ManyToManyField('models.Tag', related_name='products')

class Tag(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=50)

CRUD операции с async/await

# Create
user = await User.create(username='john', email='john@example.com')

# Read
user = await User.get(id=1)
all_users = await User.all()
active_users = await User.filter(is_active=True)

# Update
user.email = 'newemail@example.com'
await user.save()

# Delete
await user.delete()
await User.filter(is_active=False).delete()

Запросы с фильтрацией

# Простая фильтрация
users = await User.filter(is_active=True)

# Сложные фильтры
from tortoise.expressions import Q

users = await User.filter(
    Q(username__startswith='john') | Q(email__contains='gmail')
).all()

# Сортировка
users = await User.all().order_by('-created_at')

# Лимит и offset
first_10 = await User.all()[:10]
page_2 = await User.all()[10:20]

Сравнение с другими ORM

vs SQLAlchemy:

  • Tortoise ORM проще в использовании
  • SQLAlchemy имеет большше функционала
  • SQLAlchemy имеет дополнительную async поддержку (SQLAlchemy 1.4+)
  • Tortoise ORM легче для микросервисов

vs Django ORM:

  • Django ORM синхронная, Tortoise асинхронная
  • Tortoise ORM работает вне Django
  • Django ORM может использоваться с FastAPI через асинхронные функции

Миграции с Aerich

# Инициализация
aerich init -t models.TORTOISE_ORM

# Создание миграции
aerech migrate

# Применение миграций
aerech upgrade

Преимущества Tortoise ORM

  • Асинхронность — полная поддержка async/await
  • Простота — интуитивный API
  • Скорость — не блокирует event loop
  • Гибкость — поддержка различных БД
  • Актуальность — активная разработка

Когда использовать

  • Асинхронные веб-приложения (FastAPI, Quart)
  • Микросервисы
  • Высоконагруженные системы
  • Real-time приложения