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

Событие before_commit

Событие before_commit относится к событиям сессии и вызывается непосредственно перед тем, как сессия зафиксирует текущую транзакцию. Обработчик получает первым параметром объект сессии. Событие позволяет выполнить дополнительную логику до момента COMMIT, например, проверить данные или записать аудит.

Синтаксис

from sqlalchemy import event @event.listens_for(Session, 'before_commit') def before_commit_handler(session): pass

Пример

Давайте зарегистрируем обработчик события before_commit и выведем сообщение перед фиксацией транзакции:

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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) @event.listens_for(Session, 'before_commit') def before_commit_handler(session): print('before_commit fired') with Session(engine) as session: session.add(Article(title='article')) session.commit()

Результат выполнения кода:

"before_commit fired"

Пример

Давайте внутри обработчика посмотрим, какие новые объекты готовятся к записи:

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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) @event.listens_for(Session, 'before_commit') def before_commit_handler(session): for obj in session.new: print('new:', obj.title) with Session(engine) as session: session.add(Article(title='article')) session.commit()

Результат выполнения кода:

"new: article"

Пример

Давайте используем событие before_commit для ведения простого журнала фиксаций:

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] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) log = [] @event.listens_for(Session, 'before_commit') def before_commit_handler(session): log.append('commit started') with Session(engine) as session: session.add(Article(title='article')) session.commit() print(log)

Результат выполнения кода:

['commit started']

Смотрите также

  • событие after_commit,
    которое срабатывает после фиксации транзакции
  • событие before_flush,
    которое срабатывает перед сбросом изменений
  • событие after_rollback,
    которое срабатывает после отката транзакции
  • функцию listens_for,
    которая регистрирует обработчик события
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить