Ответ
Декларативный маппинг — это основной и наиболее современный способ определения моделей в 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.