Latest Notes

把日常问题写成可复用的答案。

这里收集技术实践、排错记录、阅读札记和一些生活观察。每一篇都尽量留下清晰的上下文、判断和解决路径。

Today 持续记录,慢慢变好

技术笔记、项目复盘、阅读摘录和问题清单。

开发 16 阅读

Python 中文消息字数未超限却被拒绝:UTF-8 字节预算的定位与修复

适用场景与故障现象 某通知适配器约定:content 字段编码为 UTF-8 后最多 20 字节。英文联调一直正常,切换中文告警后却收到长度校验失败。发送端已经执行 content[:20],于是问题被误判为接收方限流。 这里的 20 是便于复现的协议约定,不代表任何第三方平台的真实限额。接入实际服务时,先查明限制对象

阅读全文
数据库 55 阅读

SQLite 转化率总是 0:整数除法与类型转换位置的复现和修复

场景与现象 日报按渠道统计访问次数与支付次数。原始计数正确,Python 接口返回的转化率却只有 0 和 1。把结果格式化成两位小数后,只是变成了 0.00 和 1.00。 本文把转化率定义为支付次数除以访问次数,返回 0 到 1 的比例;访问次数为零时返回 NULL,表示没有可计算的比例。示例使用 SQLite 与

阅读全文
开发 72 阅读

Python 去掉扩展名却改坏文件名:strip 字符集合语义的复现与修复

适用场景与现象 一个 CSV 导入任务用原始文件名去掉扩展名作为批次编号。普通测试文件 report.csv 看起来正常,上线后 sales.csv 却变成了 ale,status.csv 变成了 tatu。如果再把结果用于去重键或归档名称,就可能关联错批次,甚至覆盖已有输出。 本文用纯字符串复现故障,不执行任何文件重

阅读全文
数据库 98 阅读

SQLite 流水余额提前增加:默认窗口框架的复现与修复

适用场景与现象 账户流水按发生时间展示,每行需要显示“处理完这一笔后的累计变动”。测试数据中时间都不相同,结果一直正常;接入批量入账后,同一秒出现多笔流水,第一笔的余额竟然已经包含第二笔金额。最终合计正确,中间余额却不符合逐笔对账规则。 本文使用 SQLite 和 Python 标准库构造可重复现场。金额用整数分表示,

阅读全文
开发 104 阅读

Python 批量更新少了最后几条:zip 静默截断与延迟校验的复现和修复

适用场景 导入程序分别拿到商品编号和库存数量,然后逐项配对更新。日志显示任务正常结束,但输入有三个编号,数据库只更新了两个。下面用内存字典模拟库存写入,讨论 Python 3.10 及以上版本中的配对校验;示例不需要第三方依赖。 这里有两个独立问题:默认 zip 会在最短输入耗尽时结束;换成 strict=True 后

阅读全文
数据库 130 阅读

SQLite 零订单客户却显示一单:LEFT JOIN 计数与筛选位置的定位与修复

客户运营报表要求展示每位客户的已支付订单数,包括零单客户。上线后,没有下单的客户显示一单;开发把支付条件移到 WHERE 后,零单客户又全部消失。两次修改都能正常执行,异常藏在结果集合里。 本文用 SQLite 和 Python 标准库复现这两个问题。示例只有客户与订单的一对多关系,不涉及多张明细表交叉放大;目标是同时

阅读全文
开发 148 阅读

Python 缓存命中后列表却为空:lru_cache 缓存生成器的复现与修复

适用场景与现象 一个导出任务从配置文本读取待处理编号。为了复用解析结果,开发者给解析函数加上 @lru_cache,函数内部用 yield 逐条返回编号。第一次导出正常,第二次相同参数却没有任何数据;重启进程后又暂时恢复。 这种问题容易被当成缓存失效、配置没刷新或下游返回空数据。真正需要检查的是:缓存里保存的究竟是可重

阅读全文
数据库 264 阅读

SQLite 外层回滚后数据仍存在:嵌套 with connection 提前提交的复现与修复

导入程序先写入批次记录,再调用公共函数写明细,最后校验失败抛出异常。代码外面明明套了 with connection,重查数据库却发现批次和明细都还在。遇到这种情况,先沿调用链检查谁执行了提交,尤其是公共函数里的第二层 with connection。 下面是可执行的缩小案例,不对应某个生产事故。适用于 Python

阅读全文
开发 283 阅读

Python 批量回调全部处理最后一个任务:闭包晚绑定的复现与修复

批量注册三个导出任务,执行日志却出现三次同一个任务编号;回调数量正确,也没有异常。这时先检查回调如何绑定参数,再检查调度器是否重复投递。 本文使用进程内的零参数回调作为场景:注册阶段只保存函数,执行阶段才调用。示例不连接数据库、不访问网络,也不冒充真实生产事故。 现象:注册时正确,执行时全部变了 保存下面代码为 lat

阅读全文