Fastapi异步sql唯一约束引发内部服务器错误.而不是返回错误消息



我使用的是FastAPI和Async SQl。我已经定义了具有唯一电子邮件的架构。但当我把同一封电子邮件传递到FastAPI路由时。它在开发服务器上引发错误CCD_ 1并通过Postman返回500内部响应。我想把错误显示为一条消息,而不是500个错误,我该怎么办?

我也有同感,目前我的解决方案是一个额外的查询,用于检查用户是否存在,如果存在,则通过detail属性引发一个状态为409的HTTPException和一条单独的消息。

@app.post("/users", status_code=status.HTTP_201_CREATED, response_model=schemas.UserOut)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
existing_user = db.query(models.User).filter(models.User.email == user.email).first()
if not existing_user:
user.password = hashPassword(user.password)
new_user = models.User(**user.model_dump())
db.add(new_user)
db.commit()
db.refresh(new_user)  # this is like the returning *
return new_user
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail=f"User with email does already exist"

发生的是客户端不应该访问的错误,
您定义的验证错误与库显示的ORM和数据库引擎错误之间存在差异,
您应该做的是检查为什么用空电子邮件发送数据库查询!如果您这样做,SQL引擎将告诉您不能在那里放置NULL值,这是您设置的
在将查询发送到DB之前,应该进行验证,在FastApi中,应该使用Pydantic模型进行此类验证
编辑:
感谢@Mecid X Recebli的评论,我认为问题已经更改,我的答案不再有效。\

我的回答就好像你在向DB查询发送一封空值的电子邮件,但你的问题说你在发送一封重复的电子邮件,您应该在Pydantic模式中进行电子邮件验证,也就是说,通过查询该电子邮件的数据库,如果您有一个具有相同电子邮件的帐户,则在Pydantic-shema中的验证方法中引发验证异常。

相关内容

最新更新