РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
608 of 711 menu

Событие 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,
    которая регистрирует обработчик события
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить