我给 Claude Code 写了个 hook,结果把数据库干崩了
用 AI 编程助手写数据同步服务,从脚手架到生产部署的完整踩坑记录。连接池爆掉、重试逻辑缺陷、分块策略翻车——每一个坑都花了我真金白银的时间。
# 我给 Claude Code 写了个 hook,结果把数据库干崩了
上周接到一个需求,要写个自动化脚本,每天从多个 API 拉数据、聚合、写进数据库。听起来很简单对吧?三个小时就能搞定。
我花了两天。
不是因为逻辑复杂,是因为我懒。
我想用 Claude Code 写这个脚本。说实话,我之前对 AI 编程助手的态度是:"能用是能用,但经常写出能跑但很丑的代码"。Claude Code 比我之前用过的 Copilot 和 Codex 都强,但强归强,你让它"帮我写个数据同步服务",它真的会给你写一个完整的、跑起来的、但有一些隐藏坑的服务。
第一刀:脚手架
我开了一个空项目,直接说:
> 写一个 Node.js 服务,每天凌晨2点从 three APIs(用户API、订单API、日志API)拉数据,聚合后写入 PostgreSQL,报错重试三次,支持 Docker 部署。
Claude Code 五分钟内给了我一整套:cron 调度、axios 请求、pg 连接池、Dockerfile、docker-compose.yml。代码结构清晰,注释写得比我以前的同事还详细。
我看了下,逻辑没问题,直接跑。
第二刀:API 对接
用户 API 返回格式正常,订单 API 有点坑——分页是 offset 不是 cursor,数据量大的时候直接超时。
我在终端里跟 Claude 说:"订单 API 每页 1000 条,总共有 50 万条,offset 分页会超时,改成 cursor 分页。"
它给我写了 cursor 分页逻辑,看起来没问题。但问题是——订单 API 的 cursor 不是返回在 response body 里,是在 Link header 里。Claude 没解析 Link header,直接按 JSON 字段取的 cursor,空了。
我发现了,手动改了两行代码,让它用 response.headers.get('link') 解析。
教训:跟 AI 协作的时候,它说的"已解决"不一定是真的解决了。你得自己看代码,尤其边界条件。
第三刀:数据库连接池
这个才是真正的坑。
我让 Claude 写一个连接池配置,它给了:
const pool = new Pool({
host: process.env.DB_HOST,
port: 5432,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASS,
max: 20,
idleTimeoutMillis: 30000,
});
看起来标准答案对吧?PostgreSQL 官方推荐这么写。
但我没注意到一件事:PostgreSQL 的 max_connections 默认是 100。我的服务要跑三个实例,每个实例 20 个连接,加上线上其他服务的连接,总数撑死了 80 左右,应该没问题。
结果我本地测试的时候,同时开了 20 个并发任务拉数据,连接数直接爆了。报错是 too many connections for role "vvking"。
我查了下,问题不在连接池配置,在我写的数据同步逻辑——每个任务都是独立的 HTTP 请求,我用了 Promise.all 把所有 API 调用一起发出去,瞬间产生大量并发。
Claude 给的代码是顺序执行的,我改成了并发,然后连接池就炸了。
修复方案:加个并发限制,用 p-limit:
const pLimit = require('p-limit');
const limit = pLimit(5); // 最多5个并发
const results = await Promise.all(
tasks.map(task => limit(() => fetchData(task)))
);
加了这个之后,连接数稳定了。
第四刀:重试逻辑
Claude 给的重试逻辑是:
async function fetchWithRetry(url, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
return await axios.get(url);
} catch (err) {
if (i === retries - 1) throw err;
}
}
}
简单粗暴,有问题吗?有问题。
它没有退避策略。三次请求间隔都是 0ms,API 限流直接把你打爆。
改成指数退避:
const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
await new Promise(r => setTimeout(r, delay));
这一改,API 那边的限流告警消失了。
最终成果
跑了一周,每天凌晨2点准时拉数据,没出过问题。
我用 Claude Code 写了多少行?大概 600 行左右,其中 200 行是它写的,400 行是我改的。
说真的,AI 编程助手最大的价值不是"帮你写代码",是"帮你写第一版代码"。第一版往往有各种坑,但有了这个坑坑洼洼的雏形,你改起来比从零写快多了。
它不是替代你,是替你干最无聊的那部分——搭脚手架、写 boilerplate、做类型定义。真正的活儿,还是得你自己来。
几个实用建议
2. **重要的边界条件你自己想清楚**,告诉它,而不是让它"发挥"。
3. **代码 review 不能省**。AI 写的代码能跑,不代表逻辑对。
4. **出错的时候,把错误信息直接贴给它**,比描述问题管用十倍。
*写于 2026-08-18,一个被连接池坑过之后的深夜*