报错是这么冒出来的。一万条文案生成任务中途失败,直接从头重跑,前 8000 条重复调用,费用翻倍,结果表里还出现了重复行。

中间走过弯路,把「重跑脚本没有跳过逻辑」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。进度只存在内存 进程退出即丢。少数情况下是输出按时间戳命名 无法判断是否完成。

少数情况下是结果表没有唯一键约束。

第一件事是用结果表反查已完成的 id

python -c "import sqlite3;print(sqlite3.connect('r.db').execute('select count(distinct id) from out').fetchone())"

然后输出改成按 id 命名并落盘

python gen.py --out-dir out/ --name-by id

接着重跑前读已完成集合做差集

python diff_ids.py --done out/ --all ids.txt --out todo.txt

入库加唯一索引兜底

python -c "print('CREATE UNIQUE INDEX uq_out_id ON out(id);')"

白天有业务在跑,能验证的部分都压到了晚上做。

恢复的判定其实很直接。重跑只处理剩余的两千条,总费用与首次预估一致,结果表无重复行。

断点信息必须落盘,内存里的进度在重启面前等于没有。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189