Python
Контекстный менеджер для транзакций
Собственный контекстный менеджер через 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))