小编Max*_*urt的帖子

在 FastAPI 中使用数据库依赖项,而无需通过函数树传递它

我目前正在复杂系统上使用 FastAPI 进行 POC。该项目业务逻辑繁重,完成后将与 50 多个不同的数据库表进行交互。每个模型都有一个服务,一些更复杂的业务逻辑有自己的服务(然后通过特定于模型的服务与不同的表进行交互/查询)。

虽然一切正常,但我的团队的一些成员对 Session 对象的依赖注入提出了一些反对。最大的问题主要是必须将会话从控制器传递到服务、第二个服务以及(在少数情况下)进一步的第三个服务。在这些情况下,中间服务功能往往没有数据库查询但他们调用其他服务的功能可能有一些。抱怨主要在于这更难以维护,并且必须到处传递数据库对象似乎毫无用处的重复。

代码示例:

Databases/mysql.py(项目中的 3 个数据库之一)

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

def get_uri():
    return 'the mysql uri'

engine = create_engine(get_uri())

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()


def get_db():
    db: Session = SessionLocal()
    try:
        yield db
        db.commit()
    except Exception:
        db.rollback()
    finally:
        db.close()

Run Code Online (Sandbox Code Playgroud)

控制器/controller1.py

from fastapi import APIRouter, HTTPException, Path, Depends
from sqlalchemy.orm import Session
from services.mysql.bar import get_bar_by_id
from services.mysql.process_x import bar_process
from databases.mysql …
Run Code Online (Sandbox Code Playgroud)

python database sqlalchemy fastapi

20
推荐指数
1
解决办法
2万
查看次数

标签 统计

database ×1

fastapi ×1

python ×1

sqlalchemy ×1