Python导入CSV至MySQL报错DataError:ID列数据截断的解决方法
解决MySQL导入CSV时的DataError (1265)问题
你遇到的_mysql_exceptions.DataError: (1265, "Data truncated for column 'ID' at row 1")错误,核心原因很明确:你的代码把CSV的表头行当成数据插入数据库了。
看你的CSV内容,第一行是列名(ID,SCHOOL_CODE,...),而数据库里ID字段是double类型,你把字符串"ID"往数值类型字段里插,自然会触发数据截断的错误。
下面是具体的解决步骤:
1. 跳过CSV的表头行
在循环读取数据之前,先调用next(csv_data)跳过第一行的表头,这样后续循环处理的都是真正的业务数据。
2. 加上数据库提交操作
原代码没有执行db.commit(),就算插入成功也不会把数据保存到数据库里,这是很容易忽略的细节。
3. (可选)添加异常处理(提升代码健壮性)
可以加上try-except块,捕获可能的错误,避免程序意外中断,同时方便排查问题。
修改后的完整代码
#!/usr/bin/python import MySQLdb import csv # 建立数据库连接 db = MySQLdb.connect( host="localhost", user="admin", passwd="admin", db="School_Test" ) cur = db.cursor() try: # 读取CSV文件(用with语句自动关闭文件更安全) with open('db_columns.csv', 'r') as csv_file: csv_data = csv.reader(csv_file) # 跳过表头行 next(csv_data) # 循环插入数据 for row in csv_data: cur.execute(""" INSERT INTO part_table_test (ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """, row) # 提交事务,确保数据写入数据库 db.commit() print("数据导入成功!") except Exception as e: # 出错时回滚事务,避免脏数据 db.rollback() print(f"导入失败,错误信息:{str(e)}") finally: # 无论成功失败都关闭数据库连接 db.close()
另外补充一点:虽然CSV里的数值都是字符串格式,但MySQLdb会自动帮我们转换成对应的数据库类型(比如把字符串"0"转成double类型的0),所以不需要手动做类型转换,只要跳过表头就可以解决核心问题。
内容的提问来源于stack exchange,提问作者Dinesh Ahuja
相关产品推荐
相关产品推荐

