Pre-loader


Робота з транзакціями в SQLAlchemy

SQLAlchemy - це бібліотека для роботи з реляційними базами даних в Python. Вона також підтримує транзакції для гарантії цілісності даних. Давайте розглянемо приклад, як використовувати транзакції в SQLAlchemy.

Для цього прикладу ми використаємо SQLite як базу даних.

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Створення бази даних у пам’яті SQLite
engine = create_engine(’sqlite:///:memory:’)

# Створення базового класу для оголошення моделі
Base = declarative_base()

# Визначення моделі для таблиці товарів
class Product(Base):
    __tablename__ = ’products’
    id = Column(Integer, primary_key=True)
    name = Column(String)
    quantity = Column(Integer)

# Створення таблиці у базі даних
Base.metadata.create_all(engine)

# Створення сесії SQLAlchemy
Session = sessionmaker(bind=engine)
session = Session()

def process_transaction(product_id, quantity_change):
    try:
        # Початок транзакції
        with session.begin():
            # Отримання товару з бази даних за його ідентифікатором
            product = session.query(Product).get(product_id)

            if product is not None:
                # Зміна кількості товару
                product.quantity += quantity_change
            else:
                # Додавання нового товару, якщо його немає в базі
                new_product = Product(id=product_id, quantity=quantity_change)
                session.add(new_product)

    except Exception as e:
        # Відміна транзакції у разі помилки
        print(f"Error: {e}")

# Приклад використання
process_transaction(1, 10)  # Додати 10 одиниць товару
process_transaction(1, -5)  # Списати 5 одиниць товару

# Зчитати дані із бази даних
all_products = session.query(Product).all()
for product in all_products:
    print(f"Товар {product.id}: {product.quantity} одиниць")

# Закриття сесії
session.close()

В цьому прикладі використовується session.begin() для початку транзакції, і with блок гарантує, що транзакція буде закрита автоматично (і підтверджена або відкладена) після виконання коду всередині блоку. Таким чином, ви можете забезпечити цілісність даних і автоматично відкатити транзакцію у разі помилки.

Автор: Рудюк С.А. 2023. K2 Cloud ERP.