5.3 Введение в модели SQLAlchemy
4 из 4 шагов пройдено

Введение в модели SQLAlchemy

Модели данных - это классы Python, представляющие после выполнения миграций таблицу SQL в нашей базе данных, где атрибуты модели преобразуются в столбцы в таблице. SQLAlchemy исторически имеет два различных стиля конфигурации моделей: императивный и декларативный. Оба стиля могут использоваться взаимозаменяемо, так как конечный результат каждого из них абсолютно одинаков.

Декларативное отображение

Декларативное отображение - это типичный способ построения сопоставлений в современной SQLAlchemy. Наиболее распространенным шаблоном является сначала построение базового класса с помощью функции declarative_base(), которая будет применять процесс декларативного отображения ко всем подклассам вытекающие из него.

from sqlalchemy import Column
from sqlalchemy import Integer, String
from sqlalchemy.orm import declarative_base


class Base(DeclarativeBase):
    pass


class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    username = Column(String)
    password = Column(String)

Выше, класс DeclarativeBase используется для создания нового базового класса (в документации SQLAlchemy он обычно называется Base, но может иметь любое желаемое имя), от которого могут наследоваться новые сопоставляемые классы, как показано выше, создается новый сопоставляемый класс User.

 

Императивное отображение

В «классическом» виде метаданные таблицы создаются отдельно с помощью конструкции Table, затем ассоциируются с классом User через метод registry.map_imperatively(), после создания экземпляра registry. Обычно один экземпляр registry разделяется для всех сопоставленных классов, которые связаны друг с другом:

from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import registry

mapper_registry = registry()

user_table = Table(
    "user",
    mapper_registry.metadata,
    Column("id", Integer, primary_key=True),
    Column("name", String(50)),
    Column("fullname", String(50)),
    Column("nickname", String(12)),
)


class User:
    pass


mapper_registry.map_imperatively(User, user_table)

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

Мы в курсе будем использовать декларативное отображение моделей, в следующем шаге рассмотрим их подробнее.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.