Python使用MySQLdb executemany批量插入大量数据时部分记录丢失如何解决
批量插入MySQL数据丢失的可能原因
- 未手动提交事务
MySQLdb默认开启事务机制,执行完cursor.executemany()后必须调用数据库连接对象的commit()方法,否则所有修改会在连接关闭时自动回滚,不会实际写入数据库。你提供的插入函数中没有提交事务的逻辑,是最高概率的诱因。 - 必填字段未赋值也无默认值
你的表结构中anaq_capacidad字段定义为int(1) NOT NULL,且未设置默认值,但INSERT语句的字段列表中完全没有包含该字段,插入时会因必填字段缺失直接失败。 - 字符集不兼容导致插入失败
表的字符集为latin1,仅支持西欧字符,而Python2中读取Excel得到的是Unicode字符串,如果包含重音符号、中文等latin1不支持的字符,就会出现你看到的Incorrect string value警告,严重时会直接导致整条/整批记录插入失败。你之前配置了忽略警告,所以完全感知不到这类错误。 - 批量插入的原子性导致整批失败
InnoDB引擎的事务是原子性的,executemany批量插入的100条记录中只要有1条不符合约束(比如字段长度超限、枚举值不合法),整批100条记录都会全部回滚,不会有部分插入的情况。 - 字段长度超出定义限制
表中anaq_letra字段定义为varchar(1),仅允许存储1个字符,如果拆分得到的let变量长度超过1(比如原始拆分结果是两位的04而非4),就会触发约束错误导致插入失败。 - 异常捕获逻辑过于宽泛
你使用了无差别try-except捕获所有异常,仅打印错误类型,很多非致命的约束错误、警告不会被捕获输出,无法感知插入过程中的异常。
内容的提问来源于stack exchange,提问作者Julio Garcia
相关产品推荐
相关产品推荐

