@albertalexandrov

Как сессии SQLAlchemy использовать внешнюю транзакцию?

Пытаюсь сделать декоратор, которой бы оборачивал вьюху 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 открывается, однако, изменения не попадает в нее. Вместо этого они попадают в транзакцию сессии. Я вроде где то видел, что если есть уже открытая транзакция, то сессия пишет в нее, но не смог сделать так.

Как сделать так, чтобы сессия писала в транзакцию, которая была открыта в декораторе?
  • Вопрос задан
  • 185 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы