Класс CheckConstraint
Класс CheckConstraint создает проверочное
ограничение (CHECK) на колонку или таблицу.
Первым параметром передается SQL-выражение,
которое должно возвращать истину для каждой
строки таблицы. Ограничение можно задать
как при описании колонки, так и отдельно
в атрибуте __table_args__. Параметр
name задает имя ограничения, а параметр
deferrable управляет отложенной проверкой.
Синтаксис
CheckConstraint(sqltext, [name], [deferrable])
Пример
Давайте создадим таблицу articles с
проверочным ограничением на колонку
status, которое разрешает только
значения 'draft', 'published'
и 'archived':
from sqlalchemy import create_engine, CheckConstraint, Integer, 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(
String(20),
CheckConstraint(
"status IN ('draft', 'published', 'archived')",
name='check_article_status'
)
)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__table__.constraints)
Результат выполнения кода:
{CheckConstraint('status IN (\'draft\', \'published\', \'archived\')')}
Пример
Давайте зададим проверочное ограничение
через атрибут __table_args__, чтобы
проверить числовое поле num на
положительное значение:
from sqlalchemy import create_engine, CheckConstraint, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
__table_args__ = (
CheckConstraint('num > 0', name='check_num_positive'),
)
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
num: Mapped[int] = mapped_column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
for constraint in Article.__table__.constraints:
print(constraint.name)
Результат выполнения кода:
"check_num_positive"
Пример
Давайте посмотрим итоговый SQL-запрос создания таблицы с проверочным ограничением:
from sqlalchemy import create_engine, CheckConstraint, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.schema import CreateTable
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(
String(20),
CheckConstraint(
"status IN ('draft', 'published')",
name='check_article_status'
)
)
engine = create_engine('sqlite:///:memory:')
print(CreateTable(Article.__table__).compile(engine))
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
title VARCHAR(100) NOT NULL,
status VARCHAR(20) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT check_article_status CHECK (status IN ('draft', 'published'))
)
Смотрите также
-
класс
Constraint,
который является базовым классом для всех ограничений -
класс
PrimaryKeyConstraint,
который задает первичный ключ таблицы -
класс
ForeignKeyConstraint,
который задает внешний ключ таблицы -
класс
UniqueConstraint,
который задает ограничение уникальности