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

Тип ENUM

Тип ENUM создает колонку, значения которой ограничены заранее заданным списком строк. Первым параметром передается список допустимых значений. В Python удобно комбинировать этот тип со стандартным enum.Enum, чтобы получать типизированные значения на стороне приложения.

В СУБД, которые поддерживают нативный тип перечисления (например, PostgreSQL), создается настоящий ENUM-тип. В остальных СУБД, таких как SQLite, тип эмулируется через проверку CHECK или хранится как строка. Параметр native_enum управляет этим поведением, а name задает имя типа в базе данных.

Синтаксис

from sqlalchemy import Enum Enum(*enums, [name], [native_enum], [create_constraint], [validate_strings])

Пример

Давайте создадим модель с колонкой типа ENUM и вставим в нее строку:

from sqlalchemy import create_engine, Enum, select 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] status: Mapped[str] = mapped_column(Enum('draft', 'published', 'archived')) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article', status='draft')) session.commit() res = session.scalars(select(Article.status)).all() print(res)

Результат выполнения кода:

['draft']

Пример

Давайте передадим в качестве первого параметра Python-перечисление и выведем допустимые значения:

from enum import Enum as PyEnum from sqlalchemy import Enum class Status(PyEnum): draft = 'draft' published = 'published' archived = 'archived' status_type = Enum(Status) print(status_type.enums)

Результат выполнения кода:

['draft', 'published', 'archived']

Пример

Давайте попробуем записать значение, которого нет в списке допустимых, и посмотрим на ошибку:

<+python+> from sqlalchemy import create_engine, Enum 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] status: Mapped[str] = mapped_column(Enum('draft', 'published', 'archived')) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article', status='deleted')) session.commit() <-python+>

Результат выполнения кода:

"LookupError: 'deleted' is not among the defined enum values."

Пример

Давайте отключим создание ограничения CHECK параметром create_constraint и зададим имя типа через name:

<+python+> from sqlalchemy import create_engine, Enum, select 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] status: Mapped[str] = mapped_column( Enum( 'draft', 'published', 'archived', name='article_status', create_constraint=False, ) ) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article', status='published')) session.commit() res = session.scalars(select(Article.status)).all() print(res) <-python+>

Результат выполнения кода:

['published']

Смотрите также

  • тип String,
    который хранит строки произвольной длины
  • тип Text,
    который хранит длинные текстовые значения
  • тип VARCHAR,
    который хранит строки с ограничением длины
  • тип CHAR,
    который хранит строки фиксированной длины
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить