为什么我们在Fastapi中用sqlalchemy使用yield来获取Sessionlocal?

Uje*_*ada 20 python sqlalchemy fastapi

def get_db():
    db = SessionLocal()
    try:
        return db
    finally:
        db.close()
Run Code Online (Sandbox Code Playgroud)

我剪掉了这段代码,以便使用 Sqlalchemy 在 fastapi 中获取 Sessionlocal。好吧,当我使用 return 而不是 Yield 时。我的代码仍然有效。然后,我不明白使用 Yield 的原因。有人能帮我吗?

Yag*_*nci 18

好吧,当我使用 return 而不是 Yield 时。我的代码仍然有效。然后,我不明白使用 Yield 的原因。

这是一个很好的问题,答案是,是的,有理由使用yield 而不是return。

SQLAlchemy默认具有连接池机制。这意味着使用 Yield,您将为每个请求创建一个会话。当您使用时,return您的所有应用程序都使用单个数据库连接。

还不清楚吗?让我们想象一下它,让事情变得更有趣。

在此输入图像描述

那么这个例子中有什么?

  • 一个连接池,容纳 5 个不同的连接。
  • 2个端点
  • 3 个传入请求。

当您使用yield时,它看起来像下面这样,因为它会到达一个端点,向数据库询问一些内容,并且yield每次都会创建一个新的Session对象。它提供了围绕一系列操作的事务范围,但使用return那里而不是只会yield返回该会话对象。


ale*_*ame 14

有一个根本的区别,当您使用 a 时return,关闭是在函数返回对象之前db执行的,实际上您正在返回一个关闭的 db对象。因为

当使用子句return将控制传递出语句时,该子句将在真正离开函数之前执行。tryfinallyfinally

否则,当yield使用 时,finally代码块将在处理请求并发送响应执行。您可以在此处阅读有关 Yield 依赖关系的更多信息。

为什么你的代码继续工作,如果不看到整个代码我就无法判断。

  • 确切地说,这应该是答案。它记录在 FastAPI 中:https://fastapi.tiangolo.com/tutorial/dependency/dependency-with-yield/ (4认同)