Атрибут unique класса Column
Атрибут unique класса Column
устанавливает ограничение уникальности для
столбца таблицы. Если атрибут равен True,
то база данных не позволит вставить две строки
с одинаковыми значениями в этом столбце.
Атрибут принимает булево значение и по умолчанию
равен False.
Атрибут можно задать как при создании объекта
Column напрямую, так и через функцию
mapped_column при declarative-описании моделей.
Уникальность работает на уровне СУБД и создает
соответствующий индекс или constraint.
Синтаксис
Column(..., unique=True)
Пример
Давайте создадим таблицу с уникальным столбцом
title и попробуем вставить дублирующиеся
значения:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
from sqlalchemy.exc import IntegrityError
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String, unique=True)
text = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article', text='first'))
session.commit()
session.add(Article(title='article', text='second'))
try:
session.commit()
except IntegrityError as e:
print('IntegrityError: duplicate title')
Результат выполнения кода:
"IntegrityError: duplicate title"
Пример
Давайте посмотрим, как атрибут unique
отражается в SQL-запросе создания таблицы:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base
from sqlalchemy.schema import CreateTable
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String, unique=True)
status = Column(String)
engine = create_engine('sqlite:///:memory:')
print(CreateTable(Article.__table__).compile(engine))
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
title VARCHAR NOT NULL,
status VARCHAR,
PRIMARY KEY (id),
UNIQUE (title)
)
Пример
Давайте зададим уникальность через
mapped_column в современном стиле
SQLAlchemy 2.0:
from sqlalchemy import create_engine, String
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] = mapped_column(String, unique=True)
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article', num=1),
Article(title='user', num=2),
])
session.commit()
res = session.query(Article.title).all()
print(res)
Результат выполнения кода:
[('article',), ('user',)]
Смотрите также
-
класс
Column,
который представляет столбец таблицы -
атрибут
index,
который создает индекс для столбца -
атрибут
primary_key,
который делает столбец первичным ключом -
атрибут
nullable,
который разрешает или запрещает NULL в столбце