РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
167 of 711 menu

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