如何在 FastAPI RealWorld 示例应用程序中应用事务逻辑?

How to apply transaction logic in FastAPI RealWorld example app?

我正在使用 nsidnev/fastapi-realworld-example-app

我需要将交易逻辑应用到这个项目。

在一个 API 中,我从存储库中调用了很多方法,并在许多表中进行了更新、插入和删除操作。如果其中任何一个操作出现异常,我该如何回滚更改? (或者如果一切正确则提交。)

nsidnev/fastapi-realworld-example-app is using asyncpg.

有两种使用方式Transactions

1。 async with 声明

async with conn.transaction():
    await repo_one.update_one(...)
    await repo_two.insert_two(...)
    await repo_three.delete_three(...)

    # This automatically rolls back the transaction:
    raise Exception

2。 startrollbackcommit 语句

tx = conn.transaction()
await tx.start()

try:
    await repo_one.update_one(...)
    await repo_two.insert_two(...)
    await repo_three.delete_three(...)
except:
    await tx.rollback()
    raise
else:
    await tx.commit()

在路由

中获取连接conn

注入conn: Connection = Depends(_get_connection_from_pool).

from asyncpg.connection import Connection
from fastapi import Depends

from app.api.dependencies.database import _get_connection_from_pool


@router.post(
    ...
)
async def create_new_article(
    ...
    conn: Connection = Depends(_get_connection_from_pool),  # Add this
) -> ArticleInResponse: