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

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