Атрибут unmodified
Атрибут unmodified класса InstanceState
возвращает True, если объект находится
в сессии, является постоянным и не имеет
несохранённых изменений. Это логическое
свойство доступно через функцию
sqlalchemy.inspect, которая возвращает
объект InstanceState для любого
экземпляра модели. Атрибут не принимает
параметров.
Синтаксис
inspect(obj).unmodified
Пример
Давайте создадим модель, добавим объект в сессию и проверим его состояние:
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)
with Session(engine) as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
session.commit()
state = inspect(article)
print(state.unmodified)
Результат выполнения кода:
True
Пример
Давайте изменим атрибут объекта и снова проверим состояние:
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)
with Session(engine) as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
session.commit()
article.title = 'updated article'
state = inspect(article)
print(state.unmodified)
Результат выполнения кода:
False
Пример
Давайте проверим, что после отката транзакции объект снова становится немодифицированным:
<+python+>
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)
with Session(engine) as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
session.commit()
article.title = 'updated article'
print(inspect(article).unmodified)
session.rollback()
print(inspect(article).unmodified)
<-python+>
Результат выполнения кода:
False
True
Смотрите также
-
класс
InstanceState,
который представляет состояние экземпляра модели -
атрибут
modified,
который показывает наличие несохранённых изменений -
атрибут
persistent,
который указывает на постоянный объект в сессии -
атрибут
session,
который возвращает сессию, связанную с объектом