我一直在使用 FastAPI/SQLAlchemy 开发我的第一个 API。我一直对数据库中的多个不同实体使用相同的四种方法(Get One、Get All、Post、Delete),从而创建了大量重复代码。例如,下面的代码是 Fungus 实体的方法。
from typing import List, TYPE_CHECKING
if TYPE_CHECKING: from sqlalchemy.orm import Session
import models.fungus as models
import schemas.fungus as schemas
async def create_fungus(fungus: schemas.CreateFungus, db: "Session") -> schemas.Fungus:
fungus = models.Fungus(**fungus.dict())
db.add(fungus)
db.commit()
db.refresh(fungus)
return schemas.Fungus.from_orm(fungus)
async def get_all_fungi(db: "Session") -> List[schemas.Fungus]:
fungi = db.query(models.Fungus).limit(25).all()
return [schemas.Fungus.from_orm(fungus) for fungus in fungi]
async def get_fungus(fungus_id: str, db: "Session") -> schemas.Fungus:
fungus = db.query(models.Fungus).filter(models.Fungus.internal_id == fungus_id).first()
return fungus
async def delete_fungus(fungus_id: str, db: "Session") -> int:
num_rows = db.query(models.Fungus).filter_by(id=fungus_id).delete()
db.commit()
return num_rows
我一直在尝试用一个接口类来制作一个抽象设计模式,该接口类独立于实体实现这四个方法。但是,根据我的理解,新的 Python 标准和 FastAPI 需要键入 python。那么,我将如何键入此函数的返回值,而不是
schemas.Fungus
或参数 schemas.CreateFungus
或 models.Fungus
.
我所拥有的是我可以使用这些值的类型,即
<class 'pydantic.main.ModelMetaclass'>
和<class 'sqlalchemy.orm.decl_api.DeclarativeMeta'>
。但是我不确定这是正确的还是鼓励的。