我在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