Введение в модели 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)
Обратите внимание, что классы, отображенные с помощью императивного подхода, полностью взаимозаменяемы с классами, отображенными с помощью декларативного подхода. Обе системы в конечном итоге создают одну и ту же конфигурацию, состоящую из таблицы в базе данных.
Мы в курсе будем использовать декларативное отображение моделей, в следующем шаге рассмотрим их подробнее.