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

Атрибут persistent класса InstanceState

Атрибут persistent класса InstanceState возвращает булево значение True или False. Он показывает, что объект уже был сохранен в базе данных и при этом остается привязанным к активной сессии. У постоянного объекта есть идентификатор в базе, а сам объект находится под управлением сессии. При этом локальные изменения объекта еще не обязательно записаны в базу, но сессия отслеживает их.

Атрибут persistent не принимает параметров, это обычное свойство состояния объекта. Получить его можно через функцию inspect, передав ей экземпляр модели.

Синтаксис

from sqlalchemy import inspect state = inspect(obj) state.persistent

Пример

Давайте создадим объект, добавим его в сессию, сохраним и проверим атрибут persistent:

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() state = inspect(article) print(state.persistent)

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

True

Пример

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

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') state = inspect(article) print(state.persistent) print(state.pending) session.add(article) session.commit() state = inspect(article) print(state.persistent) print(state.pending)

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

False False True False

Пример

Давайте отсоединим объект от сессии методом expunge и посмотрим, как изменится атрибут persistent:

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() print(inspect(article).persistent) session.expunge(article) print(inspect(article).persistent) print(inspect(article).detached)

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

True False True

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

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