Атрибут was_deleted
Атрибут was_deleted класса InstanceState
возвращает логическое значение, которое показывает,
был ли объект удален из сессии. Атрибут принимает
значение True, если объект был удален
в текущей транзакции или ранее, но все еще
связан с сессией. Если объект не удалялся,
атрибут возвращает False.
Атрибут was_deleted доступен через
объект InstanceState, который можно
получить с помощью функции inspect.
Этот атрибут полезен для проверки состояния
объекта после вызова метода delete
или до выполнения flush.
Синтаксис
state = inspect(obj)
state.was_deleted
Пример
Давайте создадим объект, удалим его из сессии
и проверим атрибут was_deleted:
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 1',
text='text 1',
status='published',
num=1
)
session.add(article)
session.commit()
state = inspect(article)
print('Before delete:', state.was_deleted)
session.delete(article)
state = inspect(article)
print('After delete:', state.was_deleted)
session.commit()
state = inspect(article)
print('After commit:', state.was_deleted)
Результат выполнения кода:
"Before delete: False"
"After delete: True"
"After commit: True"
Пример
Давайте проверим атрибут was_deleted
для объекта, который не удалялся:
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 2',
text='text 2',
status='draft',
num=2
)
session.add(article)
session.commit()
state = inspect(article)
print('Was deleted:', state.was_deleted)
Результат выполнения кода:
"Was deleted: 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 3',
text='text 3',
status='published',
num=3
)
session.add(article)
session.commit()
session.delete(article)
state = inspect(article)
print('After delete:', state.was_deleted)
session.rollback()
state = inspect(article)
print('After rollback:', state.was_deleted)
Результат выполнения кода:
"After delete: True"
"After rollback: False"
Смотрите также
-
класс
InstanceState,
который представляет состояние объекта -
атрибут
deleted,
который указывает, что объект удален -
атрибут
session,
который возвращает сессию объекта -
атрибут
persistent,
который указывает, что объект сохранен