【发布时间】:2023-01-27 17:08:51
【问题描述】:
我是 fastapi 和 sqlalchemy 的新手。我正在尝试在启动我的应用程序时初始化一些数据。这是我的想法:
@app.on_event("startup")
async def startup_event():
with SessionLocal() as session:
country_dataframe = pd.read_csv('./initialize_data/country.csv')
for index, row in country_dataframe.iterrows():
session.add(models.Country(row.to_dict()))
session.commit()
但是当我启动它时我无法获取数据库会话,它显示错误代码:
错误:追溯(最近一次通话):文件 "C:\Users\newia\Miniconda3\envs\fastapi\lib\site-packages\starlette\routing.py", 第540行,生命周期 self.lifespan_context(app) 中项目的异步:文件“C:\Users\newia\Miniconda3\envs\fastapi\lib\site-packages\starlette\routing.py”, 第 481 行,在 default_lifespan 等待 self.startup() 文件“C:\Users\newia\Miniconda3\envs\fastapi\lib\site-packages\starlette\routing.py”, 第 516 行,在启动中 await handler() 文件“D:\Software Projects\PythonProjects\LanguageExchange\app.py”,第 27 行,在 启动事件 以 SessionLocal() 作为会话:AttributeError:进入
错误:应用程序启动失败。退出。
有没有设计模式可以做到这一点?任何建议将不胜感激。
【问题讨论】:
-
你试过没有异步吗?
-
什么是
SessionLocal?请提供minimal reproducible example -
通常你会想要use
alembicto perform any migrations,这样你就可以避免在你的应用程序每次启动时重复插入数据,如果它之前已经插入过的话。然后,您可以在启动 FastAPI 之前运行 alembic 以确保数据库达到最高速度(或者您可以从启动事件处理程序以编程方式运行 alembic)。 -
您是否查看了将 FastAPI 与数据库结合使用的入门模板?它展示了这个解决方案的一个很好的例子。
-
@MatsLindh 感谢您的建议。我试图找到一种方法来做到这一点,但我找不到。你知道它在文档中的什么位置吗?
标签: python sqlalchemy fastapi