Функция mapped_column
Функция mapped_column создает объект
колонки для использования в декларативных
моделях SQLAlchemy. Она принимает параметры
колонки, такие как тип, первичный ключ,
внешний ключ, значение по умолчанию и другие.
Функция применяется вместе с аннотацией
Mapped для указания типа поля модели.
Синтаксис
mapped_column(column_type, *args, **kwargs)
Пример
Давайте создадим модель с колонкой первичного
ключа, используя mapped_column:
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]
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), schema=None)"
Пример
Давайте зададим тип колонки, длину и значение
по умолчанию через mapped_column:
from sqlalchemy import create_engine, String
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] = mapped_column(String(100))
status: Mapped[str] = mapped_column(default='draft')
num: Mapped[int] = mapped_column(default=0)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
for column in Article.__table__.columns:
print(column.name, column.type, column.default)
Результат выполнения кода:
"id INTEGER None"
"title VARCHAR(100) None"
"status VARCHAR None"
"num INTEGER 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]
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')
session.add(article)
session.commit()
print(article.id, article.title, article.text, article.status, article.num)
Результат выполнения кода:
"1 article draft 0"
Пример
Давайте зададим колонку с уникальным значением
и индексом через mapped_column:
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] = mapped_column(unique=True, index=True)
text: Mapped[str] = mapped_column(nullable=True)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__table__.columns['title'].unique)
print(Article.__table__.columns['title'].index)
Результат выполнения кода:
"True"
"True"
Смотрите также
-
класс
DeclarativeBase,
который является базой для декларативных моделей -
класс
Mapped,
который задает тип поля модели -
функцию
mapped,
которая настраивает маппинг атрибута модели -
функцию
column_property,
которая добавляет вычисляемое свойство в модель