Событие after_soft_rollback
Событие after_soft_rollback из секции
event срабатывает после отката
транзакции, который не закрывает соединение.
Первым параметром в функцию-обработчик передается
объект Session, вторым - предыдущая
транзакция SessionTransaction.
Событие особенно полезно для восстановления
состояния сессии после ошибки внутри
вложенной транзакции.
Синтаксис
from sqlalchemy import event
@event.listens_for(Session, 'after_soft_rollback')
def handler(session, previous_transaction):
pass
Пример
Давайте зарегистрируем обработчик события и посмотрим, когда он срабатывает при откате сессии:
from sqlalchemy import create_engine, event
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
@event.listens_for(Session, 'after_soft_rollback')
def on_soft_rollback(session, previous_transaction):
print('after_soft_rollback fired')
with Session(engine) as session:
session.rollback()
Результат выполнения кода:
"after_soft_rollback fired"
Пример
Давайте выполним запрос, затем откатим транзакцию и проверим состояние сессии внутри обработчика:
from sqlalchemy import create_engine, event, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
@event.listens_for(Session, 'after_soft_rollback')
def on_soft_rollback(session, previous_transaction):
print('active:', session.is_active)
print('in_transaction:', session.in_transaction())
with Session(engine) as session:
session.execute(text('SELECT 1'))
session.rollback()
Результат выполнения кода:
"active: True"
"in_transaction: False"
Пример
Давайте в обработчике восстановим сессию после отката, выполнив повторный запрос:
from sqlalchemy import create_engine, event, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with engine.begin() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
@event.listens_for(Session, 'after_soft_rollback')
def on_soft_rollback(session, previous_transaction):
res = session.execute(text('SELECT title FROM articles'))
print(res.scalar())
with Session(engine) as session:
session.rollback()
Результат выполнения кода:
"article"
Смотрите также
-
событие
after_rollback,
которое вызывается после полного отката транзакции -
событие
after_commit,
которое срабатывает после фиксации транзакции -
функцию
listens_for,
которая регистрирует обработчик события -
функцию
remove,
которая удаляет зарегистрированный обработчик