РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
295 of 711 menu

Класс 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,
    который является базовым классом ограничений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить