Атрибут pending класса InstanceState
Атрибут pending класса InstanceState
возвращает булево значение True или False,
которое показывает, находится ли объект в состоянии
ожидания. Объект становится pending после
добавления в сессию через add, но до
выполнения flush. В этом состоянии объект
еще не имеет записи в базе данных, но уже связан
с сессией. Атрибут доступен через
inspect для любого экземпляра модели.
Синтаксис
state.pending
Пример
Давайте создадим модель и проверим значение
атрибута pending сразу после добавления
объекта в сессию:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy import inspect
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 = inspect(article)
print(state.pending)
Результат выполнения кода:
True
Пример
Давайте проверим, что после выполнения
flush атрибут pending
становится False, так как объект
переходит в состояние persistent:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy import inspect
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 = inspect(article)
print(state.pending)
session.flush()
print(state.pending)
Результат выполнения кода:
True
False
Пример
Давайте убедимся, что для объекта, полученного
из базы данных, атрибут pending
равен False, ведь такой объект уже
существует в базе:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy import inspect
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 = inspect(article)
print(state.pending)
Результат выполнения кода:
False
Смотрите также
-
класс
InstanceState,
который хранит состояние экземпляра модели -
атрибут
persistent,
который показывает, что объект сохранен в базе -
атрибут
transient,
который показывает, что объект не связан с сессией -
атрибут
session,
который возвращает сессию, связанную с объектом