Класс UniqueConstraint
Класс UniqueConstraint создает ограничение
уникальности на один или несколько столбцов
таблицы. Первым параметром передаются имена
столбцов, для которых нужно обеспечить
уникальность значений. Дополнительно можно
задать имя ограничения параметром name.
Ограничение гарантирует, что комбинация
значений в указанных столбцах не будет
повторяться в таблице.
Синтаксис
UniqueConstraint(column1, column2, ..., name=None)
Пример
Давайте создадим таблицу с ограничением уникальности на один столбец:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, UniqueConstraint
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String, nullable=False),
Column('text', String),
UniqueConstraint('title', name='uq_articles_title')
)
metadata.create_all(engine)
print(articles.constraints)
Результат выполнения кода:
{UniqueConstraint('title'), PrimaryKeyConstraint('id')}
Пример
Давайте создадим ограничение уникальности на несколько столбцов одновременно:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, UniqueConstraint
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String, nullable=False),
Column('status', String),
UniqueConstraint('title', 'status', name='uq_articles_title_status')
)
metadata.create_all(engine)
from sqlalchemy import insert
with engine.connect() as conn:
conn.execute(insert(articles).values(title='article', status='published'))
conn.execute(insert(articles).values(title='article', status='draft'))
res = conn.execute(articles.select()).fetchall()
print(res)
Результат выполнения кода:
[(1, 'article', 'published'), (2, 'article', 'draft')]
Пример
Давайте попробуем вставить дублирующиеся значения и посмотрим, что произойдет:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, UniqueConstraint, insert
from sqlalchemy.exc import IntegrityError
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String, nullable=False),
UniqueConstraint('title', name='uq_articles_title')
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(insert(articles).values(title='article'))
try:
conn.execute(insert(articles).values(title='article'))
except IntegrityError as e:
print('IntegrityError: duplicate title')
Результат выполнения кода:
"IntegrityError: duplicate title"
Пример
Давайте используем ограничение уникальности
в декларативной модели с помощью
__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', 'num', name='uq_articles_title_num'),
)
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
Давайте создадим таблицу по этой модели и проверим работу ограничения:
from sqlalchemy import create_engine, insert
from sqlalchemy.exc import IntegrityError
from models import Base, Article
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(insert(Article).values(title='article', text='text 1', status='published', num=1))
conn.execute(insert(Article).values(title='article', text='text 2', status='draft', num=2))
try:
conn.execute(insert(Article).values(title='article', text='text 3', status='published', num=1))
except IntegrityError:
print('IntegrityError: duplicate title and num')
Результат выполнения кода:
"IntegrityError: duplicate title and num"
Смотрите также
-
класс
PrimaryKeyConstraint,
который задает первичный ключ таблицы -
класс
ForeignKeyConstraint,
который задает внешний ключ таблицы -
класс
CheckConstraint,
который задает условие проверки значений -
класс
Constraint,
который является базовым классом ограничений