Python

Контекстный менеджер для транзакций

Algonexys · 07.08.2026 · 👁 0

Собственный контекстный менеджер через contextlib: commit при успехе, rollback при ошибке.

Код

import sqlite3
from contextlib import contextmanager


@contextmanager
def transaction(db_path):
    """Открыть соединение, зафиксировать изменения или откатить при ошибке."""
    conn = sqlite3.connect(db_path)
    conn.row_factory = sqlite3.Row
    try:
        yield conn
        conn.commit()
    except Exception:
        conn.rollback()
        raise
    finally:
        conn.close()


with transaction("app.db") as conn:
    conn.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
    conn.execute("INSERT INTO users (name) VALUES (?)", ("Иван",))
    for row in conn.execute("SELECT * FROM users"):
        print(dict(row))