You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI+MySQL项目create_projects接口返回200与422错误求助

FastAPI + MySQL 项目:/create_projects/ 接口同时返回200与422状态码问题排查

问题概述

CRUD功能整体正常,但/create_projects/接口在Swagger UI测试时,会同时返回200成功状态码和422错误状态码。确认Pydantic Schema配置无误,但无法定位问题,也无法解读错误信息。

核心问题定位

1. 数据库表名不匹配

你的creatDB.py中创建的表均带有jason_前缀(如jason_role、jason_user、jason_project),但FastAPI代码和初始数据插入语句中使用的是不带前缀的表名(如role、user、project)。这会导致:

  • 初始数据插入失败,因为MySQL找不到对应表
  • 接口执行SQL时操作的是不存在的表,除非你手动创建了不带前缀的同名表

2. 全局数据库连接的线程安全问题

FastAPI是异步框架,你使用的全局connection和cursor无法保证线程安全。当多个请求同时访问接口时,会出现资源竞争,导致请求处理混乱,进而出现部分成功、部分报错的异常情况。

3. 错误信息显示异常

你收到的错误信息是占位符格式("loc": ["string",0]),这是因为Swagger UI未正确解析真实错误详情,通常是未捕获的数据库异常导致FastAPI无法生成标准验证错误。

修复步骤

1. 统一数据库表名

将所有SQL语句中的表名统一,二选一即可:

  • 方案一:修改creatDB.py,去掉表名的jason_前缀
  • 方案二:修改FastAPI代码和初始插入语句,使用带jason_前缀的表名,示例:
    # FastAPI查询项目列表接口
    cursor.execute("SELECT * FROM jason_project")
    
    # 创建项目接口的插入语句
    cursor.execute("INSERT INTO jason_project (project_name, project_user) VALUES (%s, %s)", (project.project_name, project.project_user))
    

2. 修复数据库连接的线程安全问题

为每个请求创建独立的数据库连接,避免全局资源竞争:

from fastapi import FastAPI, HTTPException
from typing import List
from schema import CreateProject
import mysql.connector
from mysql.connector import Error

app = FastAPI()

def get_db_connection():
    try:
        connection = mysql.connector.connect(
            host='localhost',
            user="root",
            password="",
            database="test"
        )
        return connection
    except Error as e:
        raise HTTPException(status_code=500, detail=f"数据库连接失败: {str(e)}")

@app.post("/create_projects/", response_model=List[CreateProject])
async def create_projects(projects: List[CreateProject]):
    created_projects = []
    connection = get_db_connection()
    cursor = connection.cursor()
    try:
        for project in projects:
            created_projects.append(project)
            cursor.execute("INSERT INTO jason_project (project_name, project_user) VALUES (%s, %s)", 
                          (project.project_name, project.project_user))
        connection.commit()
    except Error as e:
        connection.rollback()
        raise HTTPException(status_code=400, detail=f"项目插入失败: {str(e)}")
    finally:
        cursor.close()
        connection.close()
    return created_projects

3. 获取真实错误信息

不要仅依赖Swagger UI,用curl测试接口以获取真实错误详情:

curl -X POST "http://localhost:8000/create_projects/" -H "Content-Type: application/json" -d '[
  {
    "project_name": "string",
    "project_user": "string"
  }
]'

FastAPI 422错误信息解读指南

标准的422错误(请求验证失败)中,detail数组的每个对象包含三个核心字段:

  • loc:错误位置,例如["body", 0]表示请求体数组的第0个元素存在问题
  • msg:具体错误描述,例如"field required"表示缺少必填字段
  • type:错误类型,例如"value_error.missing"表示值缺失

你之前收到的占位符错误是异常情况,修复数据库连接和表名问题后,就能看到标准格式的错误信息。

内容的提问来源于stack exchange,提问作者BBnew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:02:07