在FastAPI中创建数据库连接时为什么需要使用生成器?
我最近在学习一些关于API的知识。在官方文档中,我看到有一段代码被推荐:
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
我不太明白这段代码为什么需要。这个函数是和FastAPI的Depends
功能一起使用的,效果很好。不过,如果我想写个测试并使用数据库,那我就需要用next(get_db())
来获取值。我想我也可以直接运行SessionLocal()
,但我对此感到好奇。
2 个回答
1
不过,如果我想写一个测试并使用数据库,那么我需要用next(get_db())来获取值。
如果你使用Pytest来写测试,你可能会把这个包裹成一个使用了yield
的Pytest夹具:
@pytest.fixture
def db():
yield from get_db()
这样你就可以像这样使用它
def test_my_thing(db):
db.something()
2
可以查看这个链接:https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/。
这里提到的 Depends
是一种方法,它可以让你在依赖关系被丢弃时做一些“后处理”,比如关闭数据库连接。依赖关系其实就是一个简单的可调用对象,它会返回你需要的依赖。那么,怎么告诉这个可调用对象需要“清理”这个依赖呢?答案是使用Python的生成器机制,特别是 finally
语句块,这样你就可以添加一些清理代码。
你可能不应该直接使用 get_db
,而是应该通过 Depends
来使用它。在这种情况下,直接使用 SessionLocal()
来获取原始的数据库连接。