如何通过FastAPI调用接收用户输入并返回表的PostgreSQL自定义函数?
如何通过FastAPI调用返回表的PostgreSQL自定义函数
问题背景
需要实现FastAPI接口,接收用户传入的id,调用PostgreSQL自定义表值函数ptigree(id),将函数返回的多行结果集通过API返回。最初代码触发422 Unprocessable Entity错误,错误信息如下:
{"detail": [{"loc": ["body"], "msg": "field required", "type": "value_error.missing"}]}
错误原因
最初的read_pct接口中,将PctBase作为路径函数参数,FastAPI会默认将其解析为请求体参数,但GET请求通常不携带请求体,因此触发"缺少请求体"的错误。
正确实现步骤
1. 调整数据库查询逻辑,正确调用表值函数
使用SQLAlchemy的func调用PostgreSQL自定义表值函数,通过table_valued指定函数返回的列名与对应数据类型:
def retrieve_pct(id: int, db: Session): # 调用ptigree函数,声明返回列的名称和数据类型 pct_func = func.ptigree(id).table_valued( column("pid", Integer), column("horse_nm", String), column("p", Numeric(70,67)), column("crop", Integer), column("color", Enum(Colour)), column("sex", String) ) pct_stmt = select(pct_func) pct_result = db.execute(pct_stmt) return pct_result
2. 修改FastAPI接口,移除冗余请求体参数
调整接口定义,仅保留路径参数id和数据库会话依赖,将查询结果转换为Pydantic模型列表后返回:
@router.get("/get/{id}", response_model=List[PctBase]) def read_pct(id: int, db: Session = Depends(get_db)): pct_result = retrieve_pct(id=id, db=db) # 将SQLAlchemy结果行转为字典,映射到Pydantic模型 pct_objects = [PctBase(**row._asdict()) for row in pct_result] return pct_objects
关键说明
- 需确保表值函数返回的列名与Pydantic模型
PctBase的字段匹配(示例中horse_nm对应模型nm、crop对应yr、sex对应kind,需根据实际字段名调整) - GET接口无需请求体参数,避免将Pydantic模型直接作为接口参数(除非用
Query/Path显式声明为查询/路径参数) - 只读查询无需执行
db.commit()操作
内容的提问来源于stack exchange,提问作者user3105510
相关产品推荐
相关产品推荐

