FastAPI 端点返回 "unprocessable entity" [错误代码:422]

FastAPI endpoint returning "unprocessable entity" [Err code: 422]

我对 Python 有一点了解,并尝试使用 FastAPI 构建一个简单的后端 GET REQUEST returns 来自 [=] 的用户19=] MySQL 数据库。 运行 Postman 端点 returns 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()

当我 运行 邮递员时,我得到的结果是:

STATUS: 422 UNPROCESSABLE ENTITY

错误信息如下:

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

更新

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

File ".\main.py", line 27, in fetch_users user=dbhelper.getUser(database, userId) File ".\dbhelper.py", line 7, in getUser return db.query(models.User).filter(models.User.id == userId).first() raise sa_exc.ArgumentError( sqlalchemy.exc.ArgumentError: relationship 'userId' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)

您正在这样定义端点:

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

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

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