导入 5 万行客户,结果只返回一句 失败 12 条,没有行号也没有字段名,财务拿着原文件对了两个小时才找到其中三条。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
for i, row in enumerate(reader, 2):
try:
save(row)
except Exception as e:
failed.append((i, str(e), row))
异常在循环里被 catch 后只累加了计数器,行号和原始内容没有进结果对象。批量提交以后事务已结束,再想定位只能重新导入一遍。这一点先确认清楚,后面就不用反复试。
「导入失败行号」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,捕获时把 enumerate 的行号和主键一起记下来;失败明细单独存表 保留原始行内容;导入结束生成一份失败清单 前端可直接下载。
改完照着核一遍,重新导入后返回 12 条失败记录,每条带行号、手机号和错误原因,按行号能在原文件里直接定位。
