Класс MappedAsDataclass
Класс MappedAsDataclass представляет собой
миксин, который при наследовании вместе с
DeclarativeBase автоматически превращает
декларативные модели в дата-классы Python.
Это дает возможность использовать автогенерацию
методов __init__, __repr__ и
__eq__, а также применять аннотации типов
для описания колонок. Класс не принимает
обязательных параметров, но может быть
унаследован совместно с базовым классом
DeclarativeBase.
Синтаксис
class Base(MappedAsDataclass, DeclarativeBase):
pass
Пример
Давайте создадим базовый класс на основе
MappedAsDataclass и опишем модель
Article:
from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass
from sqlalchemy.orm import Mapped, mapped_column
class Base(MappedAsDataclass, DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True, init=False)
title: Mapped[str]
text: Mapped[str] = mapped_column(default='')
status: Mapped[str] = mapped_column(default='draft')
num: Mapped[int] = mapped_column(default=0)
article = Article(title='article 1')
print(article)
Результат выполнения кода:
Article(id=None, title='article 1', text='', status='draft', num=0)
Пример
Давайте создадим объект с явным указанием всех полей и сравним два дата-класса:
from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass
from sqlalchemy.orm import Mapped, mapped_column
class Base(MappedAsDataclass, DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True, init=False)
title: Mapped[str]
text: Mapped[str] = mapped_column(default='')
status: Mapped[str] = mapped_column(default='draft')
num: Mapped[int] = mapped_column(default=0)
article1 = Article(title='article 1', text='text 1', status='published', num=1)
article2 = Article(title='article 1', text='text 1', status='published', num=1)
print(article1.title)
print(article1.status)
print(article1 == article2)
Результат выполнения кода:
"article 1"
"published"
True
Пример
Давайте сохраним дата-класс в базу данных
SQLite в памяти:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass
from sqlalchemy.orm import Mapped, mapped_column, Session
class Base(MappedAsDataclass, DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True, init=False)
title: Mapped[str]
text: Mapped[str] = mapped_column(default='')
status: Mapped[str] = mapped_column(default='draft')
num: Mapped[int] = mapped_column(default=0)
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()
print(res)
Результат выполнения кода:
[Article(id=1, title='article 1', text='text 1', status='draft', num=0)]
Смотрите также
-
класс
DeclarativeBase,
который является базой для декларативных моделей -
класс
Mapped,
который описывает аннотацию типов колонок -
функцию
mapped_column,
которая настраивает параметры колонки -
функцию
declarative_base,
которая создает базовый класс моделей