Python将KNN分类后的合并二维列表存入MySQL报错求修正
MySQL插入错误排查与修正方案
核心错误点分析
- Numpy类型不兼容:
preds2作为numpy.ndarray,内部元素是numpy专属数值类型(如numpy.float64),mysql.connector无法直接解析这类非Python原生类型,会触发类型匹配错误。 - 参数传递格式错误:若INSERT语句未使用参数化占位符(
%s),或用字符串拼接、错误占位符(如%f),会导致SQL语法错误。 - 数据结构不匹配:如果
mergedata的子列表长度不是3,或字段顺序(纬度、经度、分类)与表定义的Latitude→Longitude→Class不一致,会触发字段数量/类型不匹配错误。 - 批量插入方式错误:用
execute循环插入多条数据,不仅效率低,还容易因单条数据格式问题触发多次错误。
完整修正代码
1. 预处理数据(转换类型+保证结构)
# 将numpy数组转换为Python原生类型的列表 preds_list = preds2.tolist() # 确保分类值为字符串(匹配表中Class字段的varchar类型) preds_list = [str(item) for item in preds_list] # 合并数据,严格匹配表字段顺序:Latitude, Longitude, Class # 假设new_list的每个元素是[latitude, longitude](float类型) mergedata = [] for lat_lon, cls in zip(new_list, preds_list): mergedata.append([lat_lon[0], lat_lon[1], cls])
2. 参数化批量插入数据
import mysql.connector from mysql.connector import Error # 替换为你的数据库配置 db_settings = { "host": "localhost", "database": "your_database_name", "user": "your_username", "password": "your_password" } try: conn = mysql.connector.connect(**db_settings) if conn.is_connected(): cursor = conn.cursor() # 使用%s作为通用占位符(mysql.connector对所有字段类型都用%s) insert_sql = """INSERT INTO hasilclass (Latitude, Longitude, Class) VALUES (%s, %s, %s)""" # 批量插入,executemany比循环execute更高效且稳定 cursor.executemany(insert_sql, mergedata) conn.commit() print(f"成功插入 {cursor.rowcount} 条记录") except Error as err: print(f"错误信息: {err}") finally: # 确保关闭连接 if conn.is_connected(): cursor.close() conn.close()
额外检查项
- 确认
new_list中的latitude和longitude是float类型:如果是字符串,先转换为float:new_list = [[float(lat), float(lon)] for lat, lon in new_list] - 若
preds2是多维度数组,需先扁平化处理为一维列表,确保和new_list长度一致:preds_list = preds2.flatten().tolist()
内容的提问来源于stack exchange,提问作者Jessen Jie
相关产品推荐
相关产品推荐

