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):
我对 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):