Транзакции¶
fastapi-sqlalchemy-toolkit
поддерживает оба подхода к работе с транзакциями SQAlchemy
.
Commit as you go¶
Документация Commit as you go SQLAlchemy
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from app.managers import my_model_manager
...
engine = create_async_engine(
"...",
)
async with async_sessionmaker(engine) as session:
# Вызов метода сделает SQL COMMIT
created_obj = await my_model_manager.create(session, input_data)
# Вызов метода не сделает SQL COMMIT
await my_model_manager.update(session, created_obj, name="updated_name", commit=False)
# В БД сохранится только первый вызов
Begin once¶
Документация Begin once SQLAlchemy
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from app.managers import my_model_manager
...
engine = create_async_engine(
"...",
)
# Транзакция начинается в контекстном менеджере
async with async_sessionmaker(engine) as session, session.begin():
# Этот вызов выполняет только flush, без SQL COMMIT
created_obj = await my_model_manager.create(session, input_data)
# Этот вызов выполняет только flush, без SQL COMMIT
await my_model_manager.update(session, created_obj, name="updated_name")
# Если во вложенном блоке не было исключений, то вызывается COMMIT, сохраняющий
# изменения от обоих вызовов