Атрибут 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,
который возвращает сессию, связанную с объектом