AI 编码 Agent 生成单列假值优秀但处理深关联表时会在外键、唯一约束、NOT NULL 列上失败,导致半填充数据库。通过 MCP 调用 schema 感知的 Seedfast 工具,由其处理数据库自省和约束感知生成是可靠模式。
承诺很简单:让 AI 帮你生成测试数据,然后拿到测试数据。而现实,直到最近为止,都要混乱得多。
TL;DR: AI 编程 Agent 生成假数据的能力很强,但在关联测试数据面前却表现拉胯。一旦 schema 深度增加,Agent 就会丢失插入顺序、约束和唯一键的追踪,导致数据库只被填充了一半。再好的 prompt 也救不了这个;Agent 需要一个能感知 schema 的工具。Seedfast 读取你活着的 Postgres schema,从一句自然语言请求中生成有效、相互关联的数据行。
AI Agent 在生成看似合理的列值方面很强,但在生成连贯的多表数据方面很弱,因为遵守外键、唯一约束和 NOT NULL 列是一个约束求解问题,而不是文本补全。
常见的失败模式是数据库被填充了一半:Agent 的脚本在深度外键链中途失败,然后重新运行时会与已经插入的行发生碰撞。
可靠的模式是委托——Agent 用自然语言描述意图,然后调用一个能感知 schema 的 MCP 工具,由该工具处理自省、关系有效性和感知约束的生成。
Seedfast 暴露了一个单一的 seedfast_run MCP 工具,每次运行都会读取活着的 schema,所以数据在迁移过程中始终保持有效,无需维护种子脚本。
你已经有了一个 AI 助手。Claude Code、Cursor、Google Antigravity——其中一个就坐在你的编辑器里,写下你交付的大部分代码,在 vibe coding 的同时也处理着数据库部分。所以当需要用 AI 生成测试数据时,工作流程看起来很明显:问 Agent、拿数据、继续写代码。有时候确实管用。但如果你尝试在真实 schema 上做这件事——有外键、唯一约束、enum 列,以及五张相互引用的表——你就知道现实远比宣传的要骨感。
这是一份真正用 AI 生成测试数据的 playbook,面向已经生活在 AI 编程助手里的开发者,目标是让数据库被填充好,无需切换上下文、无需写一次性种子脚本、无需第二天早上清理只插入了一半的数据。
让 Claude 或 Cursor "用关联的 line_items 和 payments 给 orders 表填充种子",通常会发生以下情况:
Agent 读取你的 schema 文件,然后重读,在列类型和 FK 关系上消耗上下文,而下次 prompt 时它仍然需要回忆这些信息。
它写了一个 Python 或 SQL 种子脚本,与"如何给 PostgreSQL 数据库填充种子"中涵盖的相同 psql -f seed.sql 起点。脚本看起来合理,但它漏了一个 NOT NULL 列,或者插入了一条指向一个尚不存在的 user_id 的 orders 行。
它运行脚本。第一批插入成功;中间某处,约束失败了。现在你的数据库处于半填充状态。
Agent 重写脚本并重新运行。但第一次尝试的行还在那里,所以第二次运行遇到唯一键冲突,留下孤立的 FK 引用,或者悄悄复制了数据——旧行和新行纠缠在一起。
经过几轮修补和重跑,最终落地的数据在语义上是 incoherent 的:产品名称是随机字符串、关系错配、总计加起来不对。这不是你构建实际功能所需的真实场景。
这不是假设。当 Neon 尝试让 Claude 和 GPT 直接生成合成数据时,模型一旦 schema 关系加深就 consistently 挣扎——这就是约束复杂度超出模型工作上下文所能追踪的临界点。Kent C. Dodds 有一整个教程专门讲这个问题的真实版本,因为 naive 方法在接触生产形态的 schema 时无法存活。
Cursor 用户在工具自己的论坛上小声说出了真相,数据库主题里有人抱怨 Agent "不承认它从未见过的表",最终"总体上并不是很有用"于 schema 相关的工作。这与其说是 Cursor 的缺陷,不如说是同一个天花板换了不同的 logo,因为编辑器 Agent 看到的是你打开的文件,而不是它们背后的活数据库,schema 越深,就有越多的内容落在窗口之外。
问题不在于 LLM 不擅长生成假数据。它们非常擅长生成假数据。问题在于 schema 有形状,生成尊重该形状的连贯数据是一个约束求解任务,而不是文本补全任务。让引用完整性正确——每个外键都指向一条存在的行、以正确的顺序插入——是容易出错的部分。这就是 Seedfast 要填补的空白。
诀窍不是让你的 Agent 停止写种子脚本。诀窍是给它一个真正的工具让它委托——一个理解约束求解部分工具,这样 Agent 就能保持在它擅长的部分:描述意图和推理你的功能。
这就是 MCP(Model Context Protocol)所实现的,也是 Seedfast MCP 所暴露的。Agent 不是写 Python 脚本,而是调用一个单一工具——seedfast_run——并附上自然语言的范围:"用关联的 line_items 和 payments 给 orders 表填充种子"。Seedfast 处理 schema 自省、关系有效性和感知约束的生成。你的 Agent 读取结果,然后回到它实际上在帮你构建的东西上。
框架的转变很小但承载着重量:Agent 不生成测试数据。Agent 向 Seedfast 下单测试数据,Seedfast 是专门生成它的工具。整个工作流程保持对话式,但困难的部分被外包了。
"我正在构建订单历史功能。用几个关联的
line_items和payments给orders表填充种子,然后给我看一条示例行"
一次工具调用。干净的数据。上下文保持。没有半写的脚本需要手动清理。
想试试吗?安装 Seedfast——免费计划,无需信用卡。
一旦填充成为一个单一的对话步骤,很多你过去跳过的工作流程变得足够廉价,可以常规执行。
开发者 onboarding。新团队成员花数小时设置本地数据库。将 Seedfast MCP 配置在项目的 .mcp.json 中,onboarding 变成一场对话:
新开发:"用主要功能的测试数据设置我的本地数据库" AI:创建计划、填充 15 张表、在 45 秒内报告完成
结合 Docker Compose,整个本地设置就是一条命令加一个 prompt。
演示前环境准备。在客户演示前,用一句话准备环境:
"用
users、orders、products、payments表填充 staging 数据库"
始终在这里使用 plan-then-execute 模式——在触碰共享环境前审查将要填充什么。参见 MCP 设置指南了解完整模式。
迁移测试。在生产环境运行迁移前,用真实数据测试它们。填充一个 schema 副本,运行迁移,检查 ALTER TABLE 在百万行上花三秒还是三分钟。迁移测试指南涵盖了完整流程。
复现生产问题。调试生产 bug 时,在本地重建类似的数据形状:
"用关联的
subscriptions和billing_history表填充accounts表"
临时 CI 数据库。Seedfast 在临时 CI 数据库中表现良好——每个 PR 启动一个、填充它、运行测试、销毁它。每次运行都获得新鲜的、隔离的数据,作业之间没有共享状态。
多服务开发。在共享 schema 的微服务之间工作时:
"我正在处理 orders 服务。只填充 orders schema 拥有的表,但包含 shared schema 中的
users表以供外键引用"
该 prompt 假设服务仍然共享一个数据库。一旦每个服务拥有完全独立的 Postgres 实例和自己的连接字符串,填充就变成了一个协调问题而不是作用域问题——跨微服务数据库的分阶段填充需要 ID 契约和排序策略,这是那个案例需要的。
如果你想用 AI 生成测试数据——按照它本应工作的方式——不需要破损的脚本、半填充的表或上下文膨胀——设置很简单:
npm install -g seedfast@latest关于让填充在规模上可靠的模式——作用域编写、plan-then-execute、性能、错误处理——参见 MCP 设置指南。关于凭证卫生和什么数据会传到 AI 提供商,参见数据处理与隐私。
AI 能为数据库生成真实的测试数据吗?
AI 模型生成真实的个体值——姓名、邮箱、金额——非常在行。它们在关联测试数据上挣扎,因为行必须同时满足外键、唯一约束和跨多表的插入顺序。对于连贯的多表数据,将 Agent 与一个它可以调用的感知 schema 工具配对,而不是让它从头写一次性种子脚本。
为什么我的 AI Agent 的种子脚本让数据库只填充了一半?
生成的种子脚本通常以错误的顺序插入行或遗漏约束,所以它在深度外键链中途失败。重新运行会与已经插入的行发生碰撞,产生唯一键错误和孤立引用。根本原因是跨活 schema 的约束求解超出了模型在其工作上下文中可靠追踪的范围。
什么是 MCP,它如何帮助填充?
MCP(Model Context Protocol)让 AI Agent 调用外部工具,而不是写一次性的代码。有了 Seedfast 的 MCP 服务器,Agent 用一个纯英文的作用域调用一个工具——seedfast_run。Seedfast 处理 schema 自省、关系有效性和感知约束的生成,Agent 返回到你实际构建的功能上。
Seedfast 需要访问我的生产数据吗?
不需要。Seedfast 只读取你的 schema——表、列和约束定义——而不是你生产表中的行。它从头生成新鲜数据,所以真实的生产 PII 不会被复制到你的测试数据集中。你的 schema 元数据确实在生成过程中被发送到 AI 提供商(OpenAI)——参见数据处理与隐私了解具体什么数据会传输。
如何在 Claude Code 或 Cursor 中设置 Seedfast?
安装 CLI(npm install -g seedfast@latest),在 seedfa.st 获取免费 API 密钥,并将 Seedfast 添加到助手的 MCP 配置——Claude Code 用 .mcp.json,Cursor 和 VS Code 用 MCP 设置。然后用自然语言让 Agent 填充一张表。MCP 设置指南有每个客户端的配置,如果那是你的编辑器,还有一个从始至终的 Claude Code 演练。
最初发表于 seedfa.st。