Класс DeclarativeBase
Класс DeclarativeBase создает
декларативную базу, от которой наследуются
все модели приложения. Он заменяет устаревшую
функцию declarative_base и поддерживает
аннотации типов через Mapped и
mapped_column. Параметров класс не
принимает, а его наследники получают
служебный атрибут metadata и реестр
registry.
Синтаксис
class Base(DeclarativeBase):
pass
Пример
Давайте создадим декларативную базу и посмотрим на ее служебные атрибуты:
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
print(Base.metadata)
print(Base.registry)
Результат выполнения кода:
MetaData()
<sqlalchemy.orm.decl_api.registry object at 0x...>
Пример
Давайте унаследуем от базы модель
Article и опишем таблицу
articles:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
Теперь таблица зарегистрирована в метаданных базы:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
print(Base.metadata.tables.keys())
Результат выполнения кода:
dict_keys(['articles'])
Пример
Давайте создадим таблицы в базе данных
SQLite на основе метаданных базы:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Base.metadata.tables.keys())
Результат выполнения кода:
dict_keys(['articles'])
Пример
Давайте добавим запись через модель и прочитаем ее обратно:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
text='article text',
status='draft',
num=1,
)
session.add(article)
session.commit()
res = session.scalars(select(Article)).all()
for item in res:
print(item.id, item.title, item.status)
Результат выполнения кода:
1 article draft
Пример
Давайте опишем несколько моделей от одной базы и посмотрим на реестр классов:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
print(Base.registry.mappers)
Результат выполнения кода:
[<Mapper at 0x...; Article>, <Mapper at 0x...; User>]
Смотрите также
-
класс
Mapped,
который задает аннотацию типа колонки -
функцию
mapped_column,
которая описывает колонку модели -
класс
MappedAsDataclass,
который превращает модели в дата-классы -
функцию
declarative_base,
которая создает базу устаревшим способом