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

使用Flask将JSON文件插入MySQL时出现参数格式化错误如何解决

错误产生原因
  • 参数格式错误:cursor.execute()的第二个参数要求传入元组/列表类型,你编写的val = (json.dumps(file_content))没有加末尾逗号,Python会将其判定为单个字符串而非元组,导致参数和SQL中的%s占位符匹配失败,触发格式化错误。
  • 多余的JSON序列化操作:你通过file.read()读取的file_content本身已经是字符串格式的JSON内容,额外调用json.dumps()会对字符串二次转义,不仅存储内容不符合预期,还可能引入特殊字符导致SQL解析异常。
  • 变量未定义:代码中调用的db.commit()、db.close()使用了未定义的db变量,你初始化的MySQL连接对象是mysql,不存在db这个实例。
  • 缺失依赖导入:代码中使用了json.dumps()但没有提前导入json模块,运行时会触发NameError。
修复方案

修正后的完整代码如下:

import json
from flask import Flask
from flask_mysqldb import MySQL
 
app = Flask(__name__)
 
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = '*****'
app.config['MYSQL_DB'] = '*****'
 
mysql = MySQL(app)


@app.route("/sendf",methods=['POST'])
def sendfilet():
    cursor = mysql.connection.cursor()
    # 用with上下文管理器自动关闭文件,避免资源泄漏
    with open('output.json', 'r', encoding='utf-8') as f:
        file_content = f.read()
    sql = "INSERT INTO t1 (tablename) VALUES (%s)"
    # 末尾加逗号,明确是元组类型
    val = (file_content,)
    cursor.execute(sql, val)
    # 用正确的连接对象提交事务
    mysql.connection.commit()
    cursor.close()
    return '插入成功', 200

if __name__ == '__main__':
    app.run(debug=True,port=5050)

核心改动点:

  • 补充导入json模块(如果不需要额外处理JSON内容只是原样存储,也可以去掉所有json相关调用)
  • 调整参数格式,在val末尾加逗号,明确为元组类型
  • 替换错误的db变量调用,改用mysql.connection.commit()提交事务,关闭游标而非整个连接
  • 用with上下文管理器读取文件,避免异常场景下文件资源泄漏
  • 修正Flask返回值格式,不能直接返回状态码,需要同时返回响应内容和状态码
额外注意事项
  • 建议将MySQL表t1的tablename字段类型设置为JSON或者TEXT,如果用VARCHAR可能因为长度不足导致存储失败
  • 如果需要对JSON内容做校验后再存储,可以先用json.loads()解析file_content,验证字段合法后再序列化存入数据库,避免写入非法格式的JSON内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:15:00