返回博客
·AI工具

我给 Claude Code 写了个 hook,结果把数据库干崩了

用 AI 编程助手写数据同步服务,从脚手架到生产部署的完整踩坑记录。连接池爆掉、重试逻辑缺陷、分块策略翻车——每一个坑都花了我真金白银的时间。

#Claude Code#AI编程助手#Node.js#数据库#工程实践

# 我给 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,一个被连接池坑过之后的深夜*