Что такое декларативный маппинг в SQLAlchemy

Ответ

Декларативный маппинг — это основной и наиболее современный способ определения моделей в SQLAlchemy. Он позволяет описать таблицы базы данных и их взаимосвязи с помощью обычных Python-классов, объединяя метаданные таблицы и логику модели в одном месте.

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

Ключевые компоненты:

  • declarative_base(): Фабричная функция, которая создает базовый класс для всех моделей.
  • __tablename__: Атрибут класса, указывающий имя таблицы в БД.
  • Column: Объект, описывающий колонку таблицы, ее тип и ограничения.
  • relationship: Определяет связь между моделями (один-ко-многим, многие-ко-многим).

Пример: модели User и Post со связью "один-ко-многим"

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker, declarative_base

# 1. Создание базового класса для моделей
Base = declarative_base()

# 2. Определение модели User
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)

    # Связь: у одного пользователя может быть много постов
    posts = relationship("Post", back_populates="author")

# 3. Определение модели Post
class Post(Base):
    __tablename__ = 'posts'

    id = Column(Integer, primary_key=True)
    title = Column(String(100), nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    # Обратная связь: у поста есть один автор
    author = relationship("User", back_populates="posts")

# Использование:
# engine = create_engine('sqlite:///:memory:')
# Base.metadata.create_all(engine)

Преимущества декларативного подхода:

  • Читаемость и поддержка: Код становится интуитивно понятным, так как структура таблицы и ее программное представление находятся в одном классе.
  • Простота: Значительно сокращает количество шаблонного кода по сравнению с классическим подходом.
  • Интеграция: Является стандартом де-факто и отлично интегрируется с инструментами миграций, такими как Alembic.