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

FastAPI无法将数据保存至MySQL数据库问题求助

排查FastAPI写入MySQL数据无报错但未入库的问题

最可能的核心原因:未提交数据库事务

MySQL默认不会自动提交事务,使用mysql-connector等驱动时,执行INSERT语句后必须手动调用连接对象的commit()方法,否则操作只会停留在内存中,不会写入数据库。修改你的代码:

@app.post("/add_user")
def add_user(user: User):
    values = (user.NOMBRE, user.APELLIDOS, user.USUARIO, user.EMAIL, user.NACIMIENTO, user.SEXO, user.ALTURA, user.PESO)
    sql_query = "INSERT INTO Usuarios (Nombre, Apellidos, Usuario, Email, Nacimiento, Sexo, Altura, Peso) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
    mycursor.execute(sql_query, values)
    mydb.commit()  # 添加这行提交事务
    return {"message": "Usuario Insertado"}

(注:mydb是你的数据库连接对象,确保它已正确初始化)


其他排查方向

  • 验证数据库连接目标:确认代码中连接的是你预期的数据库实例,检查主机地址、端口、数据库名称是否正确,避免连接到测试库或其他无关数据库。
  • 检查字段/表名大小写匹配:MySQL在Linux系统下表名和字段名区分大小写,Windows下不区分。确认代码中的Usuarios表名、Nombre等字段名,和数据库中实际的表结构完全一致(包括大小写)。
  • 确认数据类型兼容性:
    • 模型中的NACIMIENTO是datetime.date类型,检查数据库中Nacimiento字段的类型是DATE还是DATETIME,如果是DATETIME,可以将模型字段改为datetime.datetime,或者在插入时转换格式。
    • 检查ALTURA、PESO的浮点类型是否和数据库字段类型匹配(比如数据库是FLOAT还是DECIMAL)。
  • 添加执行结果校验:打印游标执行后的受影响行数,确认SQL是否真正执行:
mycursor.execute(sql_query, values)
print(f"受影响行数:{mycursor.rowcount}")  # 如果输出0,说明SQL未生效
mydb.commit()
  • 捕获数据库异常:添加异常捕获逻辑,排查潜在的隐藏错误:
from mysql.connector import Error

@app.post("/add_user")
def add_user(user: User):
    try:
        values = (user.NOMBRE, user.APELLIDOS, user.USUARIO, user.EMAIL, user.NACIMIENTO, user.SEXO, user.ALTURA, user.PESO)
        sql_query = "INSERT INTO Usuarios (Nombre, Apellidos, Usuario, Email, Nacimiento, Sexo, Altura, Peso) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
        mycursor.execute(sql_query, values)
        mydb.commit()
        return {"message": "Usuario Insertado", "affected_rows": mycursor.rowcount}
    except Error as e:
        return {"message": "插入失败", "error": str(e)}
  • 校验Postman请求格式:确保请求体是JSON格式,且字段名和User模型完全一致(比如NOMBRE是大写,不能写成nombre),示例请求体:
{
    "NOMBRE": "Yago",
    "APELLIDOS": "Gómez",
    "USUARIO": "yagog",
    "EMAIL": "yago@example.com",
    "NACIMIENTO": "1995-05-15",
    "SEXO": "M",
    "ALTURA": 1.80,
    "PESO": 75.5
}
  • 检查数据库表结构:确认Usuarios表的所有必填字段都已传入值,没有字段长度限制导致数据被截断(比如NOMBRE字段长度为20,但传入了更长的字符串)。

内容的提问来源于stack exchange,提问作者Yago Gómez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:57:37