我对 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' 需要一个类或一个映射器参数(接收:
答案 0 :(得分:1)
您正在像这样定义端点:
@app.get("/user/{id}")
def fetch_users(userId: int):
您使用 id
作为 url 替代,但函数参数名称是 userId
。这应该有效:
@app.get("/user/{userId}")
def fetch_users(userId: int):