Python sqlite3 executemany:生成器中途报错,前两行为什么仍然被提交 导入任务只调用了一次executemany,输入生成器却在第三项之前报错。调用者记录了错误,随后发现前两行已经提交。关键不在于数据库忽略了异常,而在于executemany会逐项消费参数并重复执行语句,输入失败时前面... yunqueblog/ 技术教程/ 2026-10-03/ 4 阅读
Python sqlite3 executescript:脚本后来报错,为什么 with 前面写入的记录仍然留下 导入程序先执行一条INSERT,再把几条SQL交给executescript。外面已经套with db,脚本最后也报错,查询却发现前两条记录都在。不能只看缩进判断事务范围:执行入口本身可能先提交已有事务。本例在Lin... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite OR FAIL 与 ABORT:一条插入报错,前面写进去的行为什么还在 一次多行插入遇到重复编号,应用收到 IntegrityError,便认为这条语句一行也没写入。使用默认的 ABORT 时这个判断通常符合本例,但如果 SQL 明确写了 OR FAIL,失败点之前的成功修改会留下来。只... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite 延迟外键:COMMIT 已经报错,事务为什么还没有结束 导入关联数据时,子记录先到,父记录稍后才写入。延迟外键允许这类暂时不完整的状态存在于事务内部,但提交时仍必须满足约束。容易漏掉的是恢复动作:COMMIT 因延迟外键失败之后,事务可能仍然开着,已经执行的插入也还在其中... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite last_insert_rowid:刚插入的编号,为什么换连接或写日志后就变了 程序创建一条记录,接着写入另一张日志表,最后才查询 last_insert_rowid,拿到的编号却属于日志。另一次把查询交给连接池借出的新连接,结果又变成零。这个函数没有表名参数,因为它读取的是当前连接记住的最近插... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite WAL 读快照:别人已经提交,为什么我仍读到旧值且不能直接写入 同一份数据库,两个连接读到不同值一个页面读取库存后停留片刻,另一个连接把数量改为二十并提交,第一个连接再次查询却仍看到十。这在保持读事务的 WAL 模式下可能是正常快照行为。更值得注意的是,第一个连接若接着写入,不一... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
SQLite RETURNING:拿到的值为什么还没包含 AFTER 触发器的修改 插入成功后,到底读到了哪一版应用插入一条记录,顺便用 RETURNING 取得编号和显示名,省掉一次查询。如果表里还有 AFTER INSERT 触发器会整理显示名,接口返回值可能与紧接着查询的表内值不同。排查这类问... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读