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您的所有应用程序都使用单个数据库连接。
还不清楚吗?让我们想象一下它,让事情变得更有趣。
那么这个例子中有什么?
当您使用yield时,它看起来像下面这样,因为它会到达一个端点,向数据库询问一些内容,并且yield每次都会创建一个新的Session对象。它提供了围绕一系列操作的事务范围,但使用return那里而不是只会yield返回该会话对象。
ale*_*ame 14
有一个根本的区别,当您使用 a 时return,关闭是在函数返回对象之前db执行的,实际上您正在返回一个关闭的 db对象。因为
当使用子句
return将控制传递出语句时,该子句将在真正离开函数之前执行。tryfinallyfinally
否则,当yield使用 时,finally代码块将在处理请求并发送响应后执行。您可以在此处阅读有关 Yield 依赖关系的更多信息。
为什么你的代码继续工作,如果不看到整个代码我就无法判断。