FastAPI 端点返回“无法处理的实体”[错误代码:422]

时间:2021-04-23 15:40:13

标签: python mysql fastapi

我对 Python 有一点了解,并尝试使用 FastAPI 构建一个简单的后端,它是一个从 GET REQUEST MySQL 数据库返回用户的 PhpMyAdmin。在 Postman 上运行端点返回 ERROR 422。 究竟是什么导致了这个问题?以及可能的修复方法是什么?

这是我目前的代码:

这里是

#main.py
from typing import List
from fastapi import Depends, FastAPI
import dbhelper
import models
import schemas
from database import SessionLocal, engine
from sqlalchemy.orm import Session

models.myBase.metadata.create_all(bind = engine)

app = FastAPI()

def getDatabase():
    database = SessionLocal()
    try:
        yield database
    finally:
        database.close()

@app.get("/")
async def root():
    return {"message": "server live"}

@app.get("/user/{id}", response_model = schemas.User)
def fetch_users(userId: int, database: Session = Depends(getDatabase)):
    user = dbhelper.getUser(database, userId)
    if user is None:
        print("User not found")
    return user

这是models.py:

#models.py
from sqlalchemy import Column, Integer, String
from database import myBase


class User(myBase):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True, index=True)
    username = Column(String(64))
    email = Column(String(64))
    role = Column(String(10))

现在这里是 schemas.py

#schemas.py
from typing import Optional
from pydantic import BaseModel

class UserBase(BaseModel):
    id: Optional[int]
    username: str
    email: str
    role: str

class User(UserBase):
    id: int
    username: str
    email: str
    role: str

    class Config:
        orm_mode = True

这是数据库配置。文件(我正在尝试连接 phpmyadmin mysql 数据库)

#databse.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "mysql+mysqlconnector://root:@localhost:3309/forma"

engine = create_engine(DATABASE_URL)

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

myBase = declarative_base()

现在这是我构建 CRUD 的地方:

#dbhelper.py
from sqlalchemy.orm import Session
import models


def getUser(db: Session, userId: int):
    return db.query(models.User).filter(models.User.id == userId).first()

当我运行 postman 时,我得到的结果是:

<块引用>

状态:422 个无法处理的实体

错误信息如下:

{
    "detail": [
        {
            "loc": [
                "query",
                "userId"
            ],
            "msg": "field required",
            "type": "value_error.missing"
        }
    ]
}

更新

按照下面的建议,我将路径变量从“/{id}”修复为“/{userId}”,现在 Postman 返回 ERR 500: Internal Server Error 和服务器日志:

<块引用>

文件“.\main.py”,第 27 行,在 fetch_users 中 用户 = dbhelper.getUser(数据库,用户 ID) 文件“.\dbhelper.py”,第 7 行,在 getUser 中 返回 db.query(models.User).filter(models.User.id == userId).first() 引发 sa_exc.ArgumentError( sqlalchemy.exc.ArgumentError: 关系 'userId' 需要一个类或一个映射器参数(接收:

1 个答案:

答案 0 :(得分:1)

您正在像这样定义端点:

@app.get("/user/{id}")
def fetch_users(userId: int):

您使用 id 作为 url 替代,但函数参数名称是 userId。这应该有效:

@app.get("/user/{userId}")
def fetch_users(userId: int):