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

Метод rollback класса AsyncConnection

Метод rollback класса AsyncConnection откатывает текущую транзакцию, открытую в асинхронном соединении. Все изменения, выполненные в рамках этой транзакции, будут отменены. Метод не принимает параметров и является асинхронным, поэтому его нужно вызывать через await.

Метод полезен, когда нужно отменить изменения при возникновении ошибки или при нарушении бизнес-логики. После отката соединение остается открытым, и его можно использовать для новых транзакций.

Синтаксис

await connection.rollback()

Пример

Давайте создадим асинхронный движок, откроем соединение, начнем транзакцию и откатим ее методом rollback:

import asyncio from sqlalchemy import text from sqlalchemy.ext.asyncio import create_async_engine async def main(): engine = create_async_engine('sqlite+aiosqlite:///:memory:') async with engine.connect() as conn: await conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')) await conn.commit() await conn.begin() await conn.execute(text("INSERT INTO articles (title) VALUES ('article')")) await conn.rollback() res = await conn.execute(text('SELECT COUNT(*) FROM articles')) print(res.scalar()) await engine.dispose() asyncio.run(main())

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

0

Как видите, вставка строки была отменена, и в таблице осталось ноль записей.

Пример

Давайте покажем откат транзакции при возникновении ошибки:

import asyncio from sqlalchemy import text from sqlalchemy.ext.asyncio import create_async_engine async def main(): engine = create_async_engine('sqlite+aiosqlite:///:memory:') async with engine.connect() as conn: await conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')) await conn.commit() try: await conn.begin() await conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')")) await conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'user')")) await conn.commit() except Exception as error: await conn.rollback() print('Rollback:', type(error).__name__) res = await conn.execute(text('SELECT COUNT(*) FROM articles')) print(res.scalar()) await engine.dispose() asyncio.run(main())

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

Rollback: IntegrityError 0

Обе вставки были отменены, так как вторая нарушила ограничение первичного ключа.

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

  • класс AsyncConnection,
    который представляет асинхронное соединение с базой
  • метод commit,
    который фиксирует текущую транзакцию
  • метод begin,
    который начинает новую транзакцию
  • метод close,
    который закрывает асинхронное соединение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить