Атрибут expired класса InstanceState
Атрибут expired класса InstanceState
возвращает логическое значение, которое указывает,
помечен ли объект как устаревший. Когда объект
находится в состоянии expired, его
загруженные атрибуты сброшены, и при следующем
обращении к ним SQLAlchemy выполнит запрос
к базе данных для их обновления. Объект
становится устаревшим после вызова метода
expire у сессии или после коммита,
если включена опция expire_on_commit.
Атрибут не принимает параметров и доступен
только для чтения.
Синтаксис
state.expired
Пример
Давайте создадим объект, сохраним его и
проверим значение атрибута expired
сразу после добавления в сессию:
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(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
state = article._sa_instance_state
print(state.expired)
Результат выполнения кода:
False
Пример
Давайте сохраним объект, а затем вызовем
метод expire и посмотрим, как
изменится значение атрибута:
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(50))
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 = article._sa_instance_state
print(state.expired)
session.expire(article)
print(state.expired)
Результат выполнения кода:
False
True
Пример
Давайте убедимся, что после обращения
к атрибуту устаревшего объекта его
значение перезагружается и флаг
expired сбрасывается:
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(50))
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 = article._sa_instance_state
session.expire(article)
print(state.expired)
print(article.title)
print(state.expired)
Результат выполнения кода:
True
"article"
False
Смотрите также
-
класс
InstanceState,
который хранит состояние объекта ORM -
атрибут
session,
который возвращает сессию объекта -
атрибут
persistent,
который показывает, сохранен ли объект в базе -
атрибут
detached,
который показывает, отсоединен ли объект от сессии