Атрибут __table_args__
Атрибут __table_args__ объявляется внутри
декларативной модели и позволяет передать
дополнительные параметры для таблицы. Через него
задаются ограничения (UniqueConstraint,
CheckConstraint), индексы (Index),
а также словарь с аргументами конструктора
Table, например schema или
sqlite_autoincrement. Значением атрибута может
быть кортеж или словарь.
Синтаксис
class ModelName(Base):
__tablename__ = 'table_name'
__table_args__ = (constraint, index, ...)
# или
__table_args__ = {'schema': 'my_schema'}
Пример
Давайте создадим модель с составным уникальным
ограничением через __table_args__:
from sqlalchemy import UniqueConstraint
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
__table_args__ = (
UniqueConstraint('title', 'status', name='uq_title_status'),
)
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
status: Mapped[str]
print(Article.__table_args__)
Результат выполнения кода:
(UniqueConstraint(Column('title'), Column('status'), name='uq_title_status'),)
Пример
Давайте добавим проверочное ограничение
CheckConstraint и индекс Index:
from sqlalchemy import CheckConstraint, Index
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
__table_args__ = (
CheckConstraint('num > 0', name='ck_num_positive'),
Index('ix_articles_title', 'title'),
)
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
num: Mapped[int]
for arg in Article.__table_args__:
print(arg)
Результат выполнения кода:
CheckConstraint(Column('num'), table=articles, name='ck_num_positive')
Index('ix_articles_title', Column('title'), table=articles)
Пример
Давайте передадим словарь с аргументами конструктора
Table, указав комментарий к таблице и опцию
sqlite_autoincrement:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
__table_args__ = {
'sqlite_autoincrement': True,
'comment': 'Articles table',
}
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
print(Article.__table__.comment)
print(Article.__table__.kwargs)
Результат выполнения кода:
"Articles table"
{'sqlite_autoincrement': True}
Пример
Давайте объединим кортеж ограничений и словарь аргументов. Для этого словарь помещается последним элементом кортежа:
from sqlalchemy import CheckConstraint, Index
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
__table_args__ = (
CheckConstraint('num > 0', name='ck_num_positive'),
Index('ix_articles_status', 'status'),
{'comment': 'Articles table'},
)
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
status: Mapped[str]
num: Mapped[int]
print(Article.__table__.comment)
print(len(Article.__table__.constraints))
Результат выполнения кода:
"Articles table"
3
Смотрите также
-
атрибут
__tablename__,
который задает имя таблицы модели -
атрибут
__mapper_args__,
который задает параметры маппера -
класс
DeclarativeBase,
который служит базой для декларативных моделей -
функцию
mapped_column,
которая описывает колонку модели