使用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
相关产品推荐
相关产品推荐

