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

Функция as_declarative

Функция as_declarative является декоратором класса, который превращает обычный класс в декларативную базу для определения моделей. Класс, к которому применяется декоратор, становится родительским для всех моделей и получает метакласс DeclarativeMeta. После применения декоратора все атрибуты, объявленные в подклассах через Column или mapped_column, автоматически становятся колонками таблицы.

Декоратор as_declarative принимает необязательные параметры, которые передаются в метакласс: словарь cls для дополнительных атрибутов, словарь metadata для объекта MetaData, а также constructor для настройки конструктора моделей. Функция возвращает преобразованный класс, готовый к наследованию.

Синтаксис

@as_declarative class Base: pass

Пример

Давайте создадим декларативную базу с помощью декоратора as_declarative и определим модель Article:

from sqlalchemy import Integer, String from sqlalchemy.orm import as_declarative, mapped_column, Mapped @as_declarative class Base: pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) print(Article.__tablename__) print(Article.__table__)

Результат выполнения кода:

"articles" Table('articles', MetaData(), Column('id', Integer(), table=<articles>, primary_key=True, nullable=False), Column('title', String(length=100), table=<articles>, nullable=False), schema=None)

Пример

Давайте создадим таблицу в базе и добавим запись через модель, объявленную с помощью as_declarative:

from sqlalchemy import Integer, String, create_engine from sqlalchemy.orm import as_declarative, mapped_column, Mapped, Session @as_declarative class Base: pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(String(500)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article 1', text='text 1') session.add(article) session.commit() res = session.query(Article).all() for row in res: print(row.id, row.title)

Результат выполнения кода:

1 article 1

Итоговый SQL запрос:

CREATE TABLE articles ( id INTEGER NOT NULL, title VARCHAR(100) NOT NULL, text VARCHAR(500) NOT NULL, PRIMARY KEY (id) )

Пример

Давайте передадим собственный объект MetaData в декоратор as_declarative для управления схемой:

from sqlalchemy import Integer, String, MetaData from sqlalchemy.orm import as_declarative, mapped_column, Mapped metadata = MetaData() @as_declarative(metadata=metadata) class Base: pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) print(Base.metadata is metadata) print(metadata.tables.keys())

Результат выполнения кода:

True dict_keys(['articles'])

Смотрите также

  • класс DeclarativeBase,
    который является современной заменой декоратору
  • функцию declarative_base,
    которая создает декларативную базу фабричным способом
  • функцию mapped_column,
    которая объявляет колонки в моделях
  • класс Mapped,
    который аннотирует типы атрибутов моделей
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить