代码之家  ›  专栏  ›  技术社区  ›  muon

在FastAPI中连接数据库的最佳方法是什么?

  •  1
  • muon  · 技术社区  · 4 年前

    我在FastAPI中找到了两种使用数据库的方法。有什么根本的区别吗?如果是,哪种方法更可取?

    方法1 这可以在官方的FastAPI全栈中找到 example :

    from fastapi import Depends
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    
    engine = create_engine(SQLALCHEMY_DATABASE_URI, pool_pre_ping=True)
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    
    def get_db() -> Generator:
        try:
            db = SessionLocal()
            yield db
        finally:
            db.close()
    
    
    def get_current_user(
        db: Session = Depends(get_db), token: str = Depends(reusable_oauth2)
    ) -> models.User:
        ...
    
    

    方法2 以下方法在官方网站上找到 FastAPI docs ,一些博客,也在 fastapi_users 软件包文档:

    import databases
    
    DATABASE_URL = "sqlite:///./test.db"
    database = databases.Database(DATABASE_URL)
    
    @app.on_event("startup")
    async def startup():
        await database.connect()
    
    
    @app.on_event("shutdown")
    async def shutdown():
        await database.disconnect()
    
    

    编辑(2021-09-06)-方法3

    天戈洛自己在新的SQLModel包文档中推荐的另一种方式。这似乎只是上面第一种方法的变体,但为了完整性:

    https://sqlmodel.tiangolo.com/tutorial/fastapi/session-with-dependency/

    sqlite_file_name = "database.db"
    sqlite_url = f"sqlite:///{sqlite_file_name}"
    
    connect_args = {"check_same_thread": False}
    engine = create_engine(sqlite_url, echo=True, connect_args=connect_args)
    
    def get_session():
        with Session(engine) as session:
            yield session
    
    # Code here omitted 👈
    
    @app.post("/heroes/", response_model=HeroRead)
    def create_hero(*, session: Session = Depends(get_session), hero: HeroCreate):
        db_hero = Hero.from_orm(hero)
        session.add(db_hero)
        session.commit()
        session.refresh(db_hero)
        return db_hero
    
    
    0 回复  |  直到 4 年前