Событие after_delete
Событие after_delete срабатывает после того,
как объект был удален из базы данных. Оно относится
к событиям маппера и позволяет выполнить
дополнительные действия после операции DELETE.
Первым параметром обработчик принимает mapper,
вторым - connection, третьим - целевой
экземпляр объекта target.
Синтаксис
from sqlalchemy import event
@event.listens_for(SomeClass, 'after_delete')
def receive_after_delete(mapper, connection, target):
pass
Пример
Давайте создадим модель и подпишемся на событие
after_delete, чтобы вывести сообщение
после удаления объекта:
from sqlalchemy import create_engine, event
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]
@event.listens_for(Article, 'after_delete')
def after_delete_listener(mapper, connection, target):
print(f"Deleted article: {target.title}")
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)
session.commit()
Результат выполнения кода:
"Deleted article: article"
Пример
Давайте используем событие after_delete
для записи в отдельную таблицу журнала удалений:
from sqlalchemy import create_engine, event, ForeignKey
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]
class DeleteLog(Base):
__tablename__ = 'delete_log'
id: Mapped[int] = mapped_column(primary_key=True)
article_title: Mapped[str]
@event.listens_for(Article, 'after_delete')
def log_delete(mapper, connection, target):
connection.execute(
DeleteLog.__table__.insert().values(article_title=target.title)
)
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)
session.commit()
logs = session.query(DeleteLog).all()
for log in logs:
print(log.article_title)
Результат выполнения кода:
"article"
Смотрите также
-
событие
before_delete,
которое срабатывает перед удалением объекта -
событие
after_insert,
которое срабатывает после вставки объекта -
событие
after_update,
которое срабатывает после обновления объекта -
функцию
listens_for,
которая регистрирует обработчик события