Функция mapped
Функция mapped используется в декларативных моделях
для аннотирования атрибутов, которые становятся
колонками таблицы. Она принимает тип Python и возвращает
объект Mapped, который указывает SQLAlchemy
на необходимость создания колонки. Обычно применяется
вместе с mapped_column для настройки параметров
колонки: первичного ключа, значения по умолчанию,
внешних ключей и других опций.
Синтаксис
mapped(тип)
Пример
Давайте создадим модель Article с аннотированными
колонками через mapped:
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__table__)
Результат выполнения кода:
"Table('articles', MetaData(), Column('id', Integer(), table=<articles>, primary_key=True, nullable=False), Column('title', String(), table=<articles>, nullable=False), Column('text', String(), table=<articles>, nullable=False), schema=None)"
Пример
Давайте добавим колонку со значением по умолчанию
и опциональным полем через mapped_column:
from sqlalchemy import create_engine
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]
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')
session.add(article)
session.commit()
print(article.id, article.title, article.status, article.num)
Результат выполнения кода:
"1 article draft 0"
Пример
Давайте используем Optional внутри mapped,
чтобы сделать колонку необязательной:
from typing import Optional
from sqlalchemy import create_engine
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[Optional[str]]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
print(article.id, article.title, article.text)
Результат выполнения кода:
"1 article None"
Пример
Давайте запросим данные из таблицы, описанной
через mapped, и выведем список заголовков:
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3'),
])
session.commit()
res = session.scalars(select(Article.title)).all()
print(res)
Результат выполнения кода:
['article 1', 'article 2', 'article 3']
Смотрите также
-
класс
Mapped,
который представляет аннотированный тип колонки -
функцию
mapped_column,
которая настраивает параметры колонки -
класс
DeclarativeBase,
который служит базой для декларативных моделей -
атрибут
__tablename__,
который задает имя таблицы для модели