小编Jos*_*din的帖子

FastApi Sqlalchemy 如何管理事务(会话和多次提交)

我有一个带有插入和更新功能的 CRUD commit,在每个功能的末尾,如下所示:

@staticmethod
def insert(db: Session, item: Item) -> None:
    db.add(item)
    db.commit()
   
   
@staticmethod
def update(db: Session, item: Item) -> None:
    ...
    db.commit()
Run Code Online (Sandbox Code Playgroud)

我有一个端点,它从 FastAPI 依赖项接收 sqlalchemy 会话,并且需要以原子方式插入和更新(数据库事务)。

处理事务时的最佳实践是什么?我无法使用 CRUD,因为它执行多个commit.

我应该如何处理交易?你在哪里提交你的会话?在 CRUD 中?还是在每个请求的 FastAPI 依赖函数中只有一次?

python database transactions sqlalchemy fastapi

5
推荐指数
2
解决办法
1896
查看次数

在 FastAPI 中将 SQLALCHEMY session 和 scoped_session 与相同的引擎一起使用

我将 sqlalchemy 与 FastAPI 服务器一起使用,当我Session从多线程函数(不是通过 http 请求)调用对象时遇到以下错误:

QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/13/3o7r)
Run Code Online (Sandbox Code Playgroud)

只有当我的服务器收到数百个请求并且我的线程工作人员很忙时才会发生此错误。

我读到sqlalchemy.scoped_session可用于后台守护程序。

执行以下操作使错误消失:

  1. Sessionhttp请求中的常规sqlalchemy对象,FastAPI.Depends()就像文档中推荐的那样
  2. sqlalcehmy scoped_session- 我的服务器在需要访问数据库的不同线程中在后台运行任务,但每个线程都有自己的会话

可以肯定地说,每个会话对象都得到了适当的处理(scoped_session调用remove()Session调用close()

我的问题是 - 当我使用单个引擎时,不建议使用这种方法吗?我应该走不同的道路吗?

谢谢!

python database multithreading sqlalchemy fastapi

5
推荐指数
0
解决办法
97
查看次数

Uvicorn服务器超时

我正在尝试将我的服务器配置为请求超时,但我找不到有关它的任何信息。我看到uvicorn有一个名为 的属性keep_alive_timeout,默认为 5 秒。但这似乎也不起作用。

例如:

app = FastAPI()

@app.get('/test')
def test_endpoint():
    sleep(10)
Run Code Online (Sandbox Code Playgroud)

我希望请求在 5 秒后断开连接并超时,但它仍然存在并返回 200。

有人知道如何设置吗?

python rest server fastapi uvicorn

5
推荐指数
0
解决办法
9632
查看次数