Latest Notes

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

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

Today 持续记录,慢慢变好

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

开发 3 阅读

Python CSV 导入静默丢列:重复表头、BOM 与行宽异常的定位和修复

库存调整 CSV 看起来有三列,导入后却只剩两个字段;另一份文件的 sku 明明存在,程序却报 KeyError。这类问题先查文件边界,别急着给字典取值加默认值。默认值会把格式错误变成库存错误。 本文约定一个具体接口:上传 UTF-8 的 CSV,列为 sku,quantity,note,SKU 只能包含大写字母、数字

阅读全文
监控 31 阅读

Prometheus 目标消失却没有告警:用预期清单补齐 up == 0 的盲区

适用场景与故障现象 本文针对需要长期存在的固定采集端点,例如两个数据库 exporter、支付网关或边缘设备。示例只有一个 Prometheus、一个 payments job,端点为 pay-a:9100 和 pay-b:9100。主机名是演示值,接入前替换为实际地址。 典型现象是:服务停止时,up == 0 可以告

阅读全文
开发 66 阅读

Python 金额差一分钱:从 float 输入污染到 Decimal 舍入边界

场景:计算结果没报错,核对总额却对不上 订单预览、费用计算和导出报表里,容易出现两种相似的现象:2.675 保留两位变成 2.67;两条 0.335 的明细分别显示 0.34,总计却显示 0.67。前者可能是输入已经经过二进制浮点数,后者可能是逐行舍入与汇总舍入的口径不同。只把所有变量换成 Decimal,解决不了第二

阅读全文
数据库 75 阅读

PostgreSQL 报表金额翻倍:一对多关联放大聚合的定位与修复

订单明细增加退款展示后,报表的销售额突然变大。单独查订单金额正确,单独查退款也正确,只有合并查询对不上。此时先检查关联后的数据粒度:一张订单同时对应多条商品明细和多条退款时,两组明细会组合成多行,最后的 SUM 会把同一金额累计多次。 本文以 PostgreSQL 17 为语义基准,用一套可复现数据定位问题,再把查询改

阅读全文
开发 103 阅读

Python 日志一条变两条:从 handler 重复注册到传播链修复

适用场景与现象 适用于 Python 3.10 及以上的命令行程序、后台任务和自有服务。业务代码只调用一次 logger.info(),同一进程的原始输出却出现两行;或者应用工厂每执行一次,同一事件就多输出一遍。 先分清重复发生在哪一层:若进程的 stderr 只有一条,而日志平台出现两条,优先检查采集路径是否同时包含

阅读全文
数据库 112 阅读

PostgreSQL 排除查询突然返回零行:NOT IN 遇到 NULL 的定位与修复

场景:有待处理订单,补偿任务却扫不到 补偿任务从订单表里找出“尚未有成功回执”的订单。原先使用 NOT IN (SELECT order_id ...),导入一条未关联订单的回执后,任务突然返回零行,接口没有报错,查询耗时也正常。 下面是隔离复现,不代表真实生产事故。SQL 按 PostgreSQL 17 编写,使用会

阅读全文
安全 138 阅读

Python 解压不可信 ZIP:同时防住路径穿越、符号链接与解压炸弹

适用场景 本文适用于允许用户上传 ZIP 的报表导入、主题包安装、批量图片处理和离线数据交换服务。压缩包来自外部时,风险不只是文件名中出现 ../:绝对路径、Windows 盘符、反斜杠、同名覆盖、Unix 符号链接以及极高压缩比,都可能让一次普通解压变成任意文件写入或磁盘耗尽。 目标是建立一个可验收的解压边界:先检查

阅读全文
开发 161 阅读

Python 调用遗留命令乱码又卡死:字节解码、超时与安全参数实践

适用场景 本文适用于 Python 3.11 及以上版本。业务程序需要调用数据库备份工具、硬件厂商 CLI、Windows 遗留程序或内部运维命令,但这些程序的输出编码不是 UTF-8,并且可能出现长时间无响应、非零退出、输出管道堵塞或参数注入风险。 目标不是再封装一层 subprocess.run(),而是建立一个可

阅读全文
数据库 160 阅读

PostgreSQL 并发建索引失败留下 INVALID:从等待取证到在线修复

适用场景 本文适用于 PostgreSQL 13 及以上版本的生产库:为了避免普通 CREATE INDEX 长时间阻塞写入,运维或开发人员改用 CREATE INDEX CONCURRENTLY,但命令执行数十分钟后失败、被取消,或者发布系统超时退出。重新执行时又提示索引已存在,查询计划却仍然走顺序扫描。 本文重点处

阅读全文