【问题标题】:How to initialize database with some data when app startup? (fastapi, sqlalchemy)如何在应用程序启动时用一些数据初始化数据库? (fastapi, sqlalchemy)
【发布时间】: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 alembic to perform any migrations,这样你就可以避免在你的应用程序每次启动时重复插入数据,如果它之前已经插入过的话。然后,您可以在启动 FastAPI 之前运行 alembic 以确保数据库达到最高速度(或者您可以从启动事件处理程序以编程方式运行 alembic)。
  • 您是否查看了将 FastAPI 与数据库结合使用的入门模板?它展示了这个解决方案的一个很好的例子。
  • @MatsLindh 感谢您的建议。我试图找到一种方法来做到这一点,但我找不到。你知道它在文档中的什么位置吗?

标签: python sqlalchemy fastapi


【解决方案1】:

你可以查看这个入门快速 API template。我认为您对init_db.py 感兴趣的部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2020-02-03
    • 2021-01-24
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多