Пытаюсь сделать декоратор, которой бы оборачивал вьюху FastAPI и который бы открывал и закрывал транзакцию SQLAlchemy. Делаю так:
from fastapi import FastAPI
from sqlalchemy import MetaData
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from sqlalchemy.orm import declarative_base
app = FastAPI()
engine = create_async_engine("url", echo=True)
session_factory = async_sessionmaker(bind=engine, expire_on_commit=False, autocommit=False, autoflush=False)
metadata = MetaData()
Base = declarative_base(metadata=metadata)
def transaction(view):
@wraps(view)
async def wrapper(*args, **kwargs):
async with engine.begin():
result = await view(*args, **kwargs)
return result
return wrapper
class Partner(Base):
"""Поставщик (контрагент)."""
__tablename__ = "partners"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), default=uuid.uuid4, primary_key=True, index=True)
organization_name: Mapped[str]
@app.get('/')
@transaction
async def index():
session = session_factory()
partner = Partner(organization_name="Partner Name")
session.add(partner)
await session.flush()
await session.refresh(partner)
return {'partner_id': partner.id}
Транзакция в декораторе transaction открывается, однако, изменения не попадает в нее. Вместо этого они попадают в транзакцию сессии. Я вроде где то видел, что если есть уже открытая транзакция, то сессия пишет в нее, но не смог сделать так.
Как сделать так, чтобы сессия писала в транзакцию, которая была открыта в декораторе?