Атрибут modified класса InstanceState
Атрибут modified класса InstanceState
возвращает логическое значение, которое
показывает, имеет ли объект несохраненные
изменения в атрибутах. Значение True
означает, что хотя бы одна колонка объекта
была изменена после его загрузки или
добавления в сессию. Значение False
говорит о том, что объект не содержит
изменений, ожидающих сброса в базу данных.
Доступ к атрибуту осуществляется через
функцию inspect, первым параметром
которой передается экземпляр модели.
Полученный объект InstanceState
содержит всю информацию о состоянии
экземпляра в рамках сессии.
Синтаксис
from sqlalchemy import inspect
state = inspect(instance)
state.modified
Пример
Давайте создадим модель, добавим объект
в сессию и проверим значение атрибута
modified сразу после добавления:
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)
state = inspect(article)
print(state.modified)
Результат выполнения кода:
True
Пример
Давайте зафиксируем изменения методом
commit и снова проверим атрибут
modified:
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.modified)
Результат выполнения кода:
False
Пример
Давайте изменим заголовок уже сохраненного
объекта и проверим, что атрибут
modified снова стал 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 = 'article 2'
state = inspect(article)
print(state.modified)
Результат выполнения кода:
True
Пример
Давайте присвоим атрибуту исходное значение
и проверим, что modified вернется
к значению 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]
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 = 'article 2'
article.title = 'article'
state = inspect(article)
print(state.modified)
Результат выполнения кода:
False
Смотрите также
-
класс
InstanceState,
который хранит состояние экземпляра модели -
атрибут
unmodified,
который показывает отсутствие изменений у объекта -
атрибут
session,
который возвращает сессию объекта -
атрибут
object,
который возвращает сам экземпляр модели