Путь:
Код: Выделить всё
@router.delete("/{id}")
async def delete_item(id: int, db: AsyncSession = Depends(get_db)):
async with db.begin(): # This is where the conflict happens
item = await db.get(Item, id)
await db.delete(item)
Код: Выделить всё
engine: AsyncEngine = create_async_engine(
f"{SETTINGS.postgres.dsn}_test"
)
@pytest.fixture
async def db_session():
async with engine.connect() as connection:
async with connection.begin() as transaction:
async_session = AsyncSession(
bind=connection,
expire_on_commit=False,
)
yield async_session
await transaction.rollback()
Конкретная ошибка:
При запуске тестов я получаю сообщение sqlalchemy.exc.InvalidRequestError: транзакция уже начата в этом сеансе. что ожидаемо, потому что во время тестов приспособление создает транзакцию верхнего уровня, и на маршруте мы пытаемся создать новую транзакцию. Однако я не хочу удалять транзакции из своей бизнес-логики только для того, чтобы выполнить тесты.
Мой вопрос:
- Каков рекомендуемый способ структурирования асинхронных транзакций SQLAlchemy 2.0, чтобы маршруты FastAPI могли использовать db.begin(), пока тесты выполняются внутри транзакции-обертки для отката?
Подробнее: https://stackoverflow.com/questions/798 ... aintaining
Мобильная версия