FastAPI 和 Pydantic 的抽象工厂

问题描述 投票:0回答:0

我一直在使用 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'> 
。但是我不确定这是正确的还是鼓励的。

python sqlalchemy abstract-class fastapi pydantic
© www.soinside.com 2019 - 2024. All rights reserved.