数据库种子数据生成器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_fccf428b/database-seeding-builder。
技能介绍
要解决的问题
手工往开发库里填测试数据,通常意味着复制粘贴假邮箱、编造日期,偶尔还会撞上外键约束。另一种常见做法是写过一版 seed 脚本后就放着不管:换个环境跑就报唯一键冲突,数据量一放大就慢得离谱,或者日期写死导致几个月后测试开始"穿越"。
技能如何工作
这个技能围绕一套可重复执行的种子数据流程展开:
- 分析目标 schema:检查所有表、列、约束(
NOT NULL、UNIQUE、CHECK、外键)和表间关系,确定父表先于子表的插入顺序。 - 设计数据策略:测试用固定随机种子保证可复现;开发环境用 Faker 生成逼真的姓名、邮箱、地址;预发环境可使用匿名化的生产快照。
- 生成 seed 脚本:按项目语言(Python、JavaScript/TypeScript、SQL、Ruby)编写,用事务包裹写入以保证原子性,通过序列模式或计数器满足唯一约束。
- 保证幂等性:使用
INSERT ... ON CONFLICT DO NOTHING、UPSERT 或先清空再插入的策略,脚本跑两次不应产生重复数据或报错。 - 环境化 profile:本地开发 10–50 行,集成测试 1K–10K 行,压测 100K+ 行,通过环境变量或命令行参数切换。
- 执行与校验:核对行数是否符合预期,验证外键均指向已存在的行,并记录每张表的写入结果。
适用边界与注意点
- 固定
Faker.seed(42)之类的种子值,测试结果才可复现;Faker 不保证大数据量下的唯一性,需要用fake.unique.email()或计数器兜底。 - 循环外键需要分两轮写入:先插可空外键行,再回填外键值。
- 超过一万行时改用批量写入(PostgreSQL
COPY、MySQLLOAD DATA INFILE),导入后重建索引。 - 依赖日期的逻辑要用相对当前时间的日期,避免写死后失效。
- 绝不要往生产库灌测试数据,脚本顶部应加环境断言;写入后重置自增序列,防止主键碰撞。
- 安全边界:不自动安装依赖、不改系统权限、不创建持久化任务;涉及发送、删除、部署等外部写入时先展示影响并取得确认。
使用场景
- 本地开发环境缺少数据,需要快速生成 50 个用户和 200 条订单记录以调试分页逻辑,且要求重复运行不产生重复数据。
- 预发环境需要贴近真实分布的 10 万条商品和订单数据做压测,同时要确保外键依赖的父表数据先于子表写入。
- 编写 CI 流程中的集成测试,需要固定随机种子生成可复现的用户邮箱和注册时间,避免每次构建结果不一致。
适合人员
- 后端工程师:需要在本地和 CI 环境中快速构造符合复杂外键约束的数据库快照,以验证业务逻辑和接口。
- 测试工程师:需要为性能测试准备十万级以上的真实分布数据集,并确保测试环境的种子数据可重复执行。
- 全栈开发者:在开发基于 Laravel 或 Django 的项目时,需要编写幂等的数据库种子脚本来填充开发库。