使用pymysql将JSON文件数据导入MySQL数据库报错求助
问题排查与解决步骤
- 第一步:修正SQL语句中带空格的字段名写法
MySQL语法规定,包含空格、特殊字符的字段名必须用反引号`包裹,否则会被识别为多个关键字触发语法错误,这是你替换%s后仍然报错的核心原因之一。 - 第二步:统一使用%s作为pymysql的占位符
pymysql的参数化查询所有数据类型都统一使用%s作为占位符,不要用%d/%f等Python原生格式化符,框架会自动根据字段类型完成转义和类型适配。 - 第三步:校验JSON数据的类型合法性
你可以在循环内先打印每个字段的值和类型,排查是否存在数值字段取到空字符串、非数值格式字符串的情况,时间字段需要保证和MySQL表中datetime/time类型的格式匹配。 - 第四步:添加异常捕获定位具体报错数据
可以在插入逻辑外包裹异常捕获,打印报错的对应原始数据,快速定位脏数据问题。
修复后参考代码
import pymysql import json # 建议用with上下文管理文件读取,避免资源泄漏 with open("data_chart.json", "r", encoding="utf-8") as f: json_obj = json.load(f) connection = pymysql.connect( host='替换为你的数据库主机地址', user='替换为你的数据库用户名', password='替换为你的数据库密码', database='替换为你的数据库名' ) cursor = connection.cursor() for item in json_obj: # 取值后做基础类型转换,可根据你表的实际字段类型调整 Current_Fridge_Temp = float(item.get("Current Fridge Temperature")) if item.get("Current Fridge Temperature") else None Target_Fridge_Temp = float(item.get("Target Fridge Temperature")) if item.get("Target Fridge Temperature") else None Current_Freezer_Temp = float(item.get("Current Freezer Temperature")) if item.get("Current Freezer Temperature") else None Target_Freezer_Temp = float(item.get("Target Freezer Temperature")) if item.get("Target Freezer Temperature") else None E_Use = float(item.get("Energy Use")) if item.get("Energy Use") else None Fridge_Last_On = item.get("Fridge Last On Time") Fridge_Last_Off = item.get("Fridge Last Off Time") Freezer_Last_On = item.get("Freezer Last On Time") Freezer_Last_Off = item.get("Freezer Last Off Time") try: # 所有带空格的字段名用反引号包裹 sql = """INSERT INTO refrigerator_id( `Current Fridge Temperature`, `Target Fridge Temperature`, `Current Freezer Temperature`, `Target Freezer Temperature`, `Energy Use`, `Fridge Last On Time`, `Fridge Last Off Time`, `Freezer Last On Time`, `Freezer Last Off Time` ) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)""" cursor.execute(sql, (Current_Fridge_Temp, Target_Fridge_Temp, Current_Freezer_Temp, Target_Freezer_Temp, E_Use, Fridge_Last_On, Fridge_Last_Off, Freezer_Last_On, Freezer_Last_Off)) except Exception as e: # 打印报错数据方便定位问题 print(f"插入失败,当前待插入数据:{item},错误提示:{e}") connection.commit() cursor.close() connection.close()
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

