Событие 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,
которая регистрирует обработчик события