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

Класс InstanceState

Класс InstanceState хранит внутреннее состояние экземпляра ORM-модели. Он позволяет узнать, к какой сессии привязан объект, каков его идентификатор в базе данных, а также определить текущий статус объекта: transient, pending, persistent, deleted, detached и другие. Доступ к объекту состояния осуществляется через функцию inspect, которой передаётся экземпляр модели. Параметров у самого класса нет - он возвращается механизмом инспекции SQLAlchemy.

Синтаксис

from sqlalchemy import inspect state = inspect(instance)

Пример

Давайте создадим модель и получим объект состояния через функцию inspect:

from sqlalchemy import create_engine, inspect 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] text: Mapped[str] status: Mapped[str] num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) article = Article(title='article', text='text', status='draft', num=1) state = inspect(article) print(state)

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

"<sqlalchemy.orm.state.InstanceState object at 0x...>"

Пример

Давайте проверим статус объекта до добавления в сессию атрибутами transient и pending:

from sqlalchemy import create_engine, inspect 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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) article = Article(title='article') state = inspect(article) print(state.transient) print(state.pending) print(state.persistent)

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

True False False

Пример

Давайте добавим объект в сессию и снова посмотрим на его состояние:

from sqlalchemy import create_engine, inspect 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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) state = inspect(article) print(state.transient) print(state.pending) print(state.session is session)

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

False True True

Пример

Давайте выполним flush и убедимся, что объект перешёл в состояние persistent, а также получим его identity:

from sqlalchemy import create_engine, inspect 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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.flush() state = inspect(article) print(state.persistent) print(state.identity)

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

True (1,)

Пример

Давайте проверим состояние после удаления объекта атрибутом deleted и после закрытия сессии атрибутом detached:

from sqlalchemy import create_engine, inspect 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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.commit() session.delete(article) state = inspect(article) print(state.deleted) print(state.detached)

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

True True

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

  • атрибут session,
    который хранит сессию, связанную с объектом
  • атрибут identity,
    который возвращает идентификатор объекта в базе
  • атрибут persistent,
    который показывает, что объект есть в базе
  • атрибут detached,
    который показывает, что объект отвязан от сессии
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить