Функция 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,
который аннотирует типы атрибутов моделей