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

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

Метод rollback класса Connection откатывает текущую транзакцию, отменяя все изменения, которые были выполнены с момента ее начала или последнего подтверждения. Метод не принимает параметров и возвращает None. После отката соединение остается открытым и готовым к выполнению новых запросов.

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

Синтаксис

Connection.rollback()

Пример

Давайте создадим таблицу, вставим строку и откатим транзакцию методом rollback:

from sqlalchemy import create_engine, text engine = create_engine('sqlite:///:memory:') with engine.connect() as conn: conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')) conn.commit() trans = conn.begin() conn.execute(text("INSERT INTO articles (title) VALUES ('article')")) trans.rollback() res = conn.execute(text('SELECT COUNT(*) FROM articles')) print(res.scalar())

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

0

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

Пример

Давайте откатим транзакцию при возникновении ошибки в процессе выполнения запросов:

from sqlalchemy import create_engine, text engine = create_engine('sqlite:///:memory:') with engine.connect() as conn: conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')) conn.commit() trans = conn.begin() try: conn.execute(text("INSERT INTO articles (title) VALUES ('article')")) conn.execute(text('INSERT INTO nonexistent_table VALUES (1)')) trans.commit() except Exception: trans.rollback() res = conn.execute(text('SELECT COUNT(*) FROM articles')) print(res.scalar())

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

0

Первая вставка была отменена, так как вторая операция завершилась ошибкой и транзакция была откачена.

Пример

Давайте сравним поведение методов commit и rollback на одном и том же наборе данных:

from sqlalchemy import create_engine, text engine = create_engine('sqlite:///:memory:') with engine.connect() as conn: conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')) conn.commit() trans = conn.begin() conn.execute(text("INSERT INTO articles (title) VALUES ('article 1')")) trans.commit() trans = conn.begin() conn.execute(text("INSERT INTO articles (title) VALUES ('article 2')")) trans.rollback() res = conn.execute(text('SELECT title FROM articles')) print(res.scalars().all())

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

['article 1']

Первый запрос был подтвержден методом commit, а второй отменен методом rollback.

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

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