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

Posted

技术标签:

【中文标题】如何在 FastAPI RealWorld 示例应用中应用事务逻辑?【英文标题】:How to apply transaction logic in FastAPI RealWorld example app? 【发布时间】:2021-12-28 07:57:04 【问题描述】:

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

我需要将事务逻辑应用到这个项目。

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

【问题讨论】:

【参考方案1】:

nsidnev/fastapi-realworld-example-app 正在使用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:

【讨论】:

以上是关于如何在 FastAPI RealWorld 示例应用中应用事务逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 html/js 的情况下捕获 fastapi websocket 消息?

FastAPI学习-9. Swagger文档输出请求示例example

19.FastAPI中间件

12.FastAPI响应状态码

10.FastAPI响应体

基于FastAPI和Docker的机器学习模型部署快速上手