Класс 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,
который показывает, что объект отвязан от сессии