name: erp-db-init
description: A3 验证 MySQL 连接 + 导出当前 schema 为 sql/migrations/V1__initial_schema.sql(Flyway 初始 migration,DDL only)+ 导出当前数据为 sql/seed-data.sql(INSERT only)。不执行任何 DDL。
user-invocable: false
allowed-tools: Read Write Edit Glob Skill Bash(mkdir ) Bash(mysql *) Bash(mysqldump *) Bash(set *) Bash(. .env.local) Bash(sed *) Bash(cat *) Bash(rm sql/migrations/.raw) Bash(rm sql/*.raw) Bash(grep *)
所有输出必须使用中文。
erp-db-init
执行步骤
步骤 0:打印当前位置流程图
向用户展示当前在 A 阶段流程中的位置(A-only,▶ 标在 A3):
┌──────────────────────────────────────────────────────┐
│ 📋 阶段 A:规划(一次性) │
│ │
│ A0 初始化项目 → A1 锁范围(REQ 卡片) │
│ ↓ │
│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │
│ ↓ │
│ A2 生成骨架 → ▶ A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│
│ ↓ │
│ 规划阶段到此结束 │
└──────────────────────────────────────────────────────┘
A. 防御性检查 .env.local
用 Glob 检查 .env.local 是否存在。
- 存在 → 进入步骤 B。
- 不存在 → 向用户输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[erp-db-init] ⚠️ .env.local 缺失
可能是被误删。请先重新运行 erp-skeleton-gen 重建,
或手动从 .env.local.example 复制并填写 DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_SCHEMA。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
B. 验证 MySQL 连接
用 Bash 执行(先加载 .env.local 变量,用 set -a; . ...; set +a 避免 shell 展开密码中的特殊字符):
set -a; . .env.local; set +a
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "USE \`$DB_SCHEMA\`; SHOW TABLES;"
注:密码中含
$、`、空格、!等字符时,.env.local需用单引号包裹值,例如DB_PASSWORD='p@ss$w0rd!'。set -a; . file; set +a与source行为一致但更明确地声明"按 KEY=VALUE 加载并导出",配合单引号可避免展开。
- 成功 → 记录表列表,继续步骤 C。
-
失败 → 向用户输出具体错误(认证失败 / schema 不存在 / 主机不可达等),提示检查
.env.local,停下。
C. 导出当前 schema 为 V1 initial migration
用 Bash 执行 mysqldump(仅 DDL,不含数据):
mkdir -p sql/migrations
set -a; . .env.local; set +a
mysqldump --no-data --skip-comments -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_SCHEMA" > sql/migrations/V1__initial_schema.sql.raw
如果 mysqldump 命令不存在,向用户输出具体错误(提示安装 mysql-client / brew install mysql-client 等)并停下(mysql 和 mysqldump 是 A0 erp-project-init 的前置依赖,正常情况下应已就绪)。
D. 加头部写入 V1 最终 migration 文件
严禁用 Read 读取 .sql.raw(dump 可能有几千行,会撑爆上下文)。用纯 shell 拼接:
PROJECT="<从 CLAUDE.md 读到的项目名称>"
TS="$(date -u +%FT%TZ)"
set -a; . .env.local; set +a
{
sed -e "s|{{project_name}}|$PROJECT|g" \
-e "s|{{timestamp}}|$TS|g" \
-e "s|{{schema_name}}|$DB_SCHEMA|g" \
"${CLAUDE_SKILL_DIR}/templates/migration-v1-header-template.sql"
cat sql/migrations/V1__initial_schema.sql.raw
} > sql/migrations/V1__initial_schema.sql
rm sql/migrations/V1__initial_schema.sql.raw
说明:
-
sed替换 header 模板里的 3 个槽位 -
cat追加 dump 内容 - 全程不经过 LLM 上下文
E. 导出当前数据为 seed-data.sql
用 Bash 执行 mysqldump(仅数据,INSERT only):
set -a; . .env.local; set +a
mysqldump --no-create-info --complete-insert --skip-comments --skip-extended-insert \
-h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_SCHEMA" > sql/seed-data.sql.raw
拼接 header 模板 + raw:
PROJECT="<从 CLAUDE.md 读到的项目名称>"
TS="$(date -u +%FT%TZ)"
set -a; . .env.local; set +a
{
sed -e "s|{{project_name}}|$PROJECT|g" \
-e "s|{{timestamp}}|$TS|g" \
-e "s|{{schema_name}}|$DB_SCHEMA|g" \
"${CLAUDE_SKILL_DIR}/templates/seed-data-sql-template.sql"
echo ""
echo "SET FOREIGN_KEY_CHECKS = 0;"
echo ""
cat sql/seed-data.sql.raw
echo ""
echo "SET FOREIGN_KEY_CHECKS = 1;"
} > sql/seed-data.sql
rm sql/seed-data.sql.raw
说明:
- 本地 MySQL 里已有的数据就是测试数据集,直接 dump 下来
-
--complete-insert让 INSERT 含列名,schema 演化后仍可读 -
--skip-extended-insert让每行一条 INSERT,diff 友好 - 全程不经过 LLM 上下文
F. 验证 + 勾选 docs/08 进度 + 进入 A4
用
Bash执行grep -c "CREATE TABLE" sql/migrations/V1__initial_schema.sql统计表数量,与步骤 B 记录的表数对比。不一致 → 报错停下。-
用
Bash执行grep -c "INSERT INTO" sql/seed-data.sql统计数据行数:- > 0:正常
- = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续
-
用
Edit在docs/08-模块任务管理.md勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项):-
- [ ] .env.local 凭据验证通过→[x] -
- [ ] MySQL 连接验证通过→[x] -
- [ ] V1 initial migration 已生成(sql/migrations/V1__initial_schema.sql,DDL only)→[x] -
- [ ] sql/seed-data.sql 已导出(本地数据快照,INSERT only)→[x] -
- [ ] A3 DB 初始化 — erp-db-init→[x]
-
输出
db-init: 完成(schema=<名称>, tables=<T>, V1 migration ✓, seed rows=<R>)。立即调用
Skill(erp-db-design-gen)进入 A4,不等用户手动输入。
不变量
- 密码通过
.env.local以set -a; . .env.local; set +a方式导出到环境变量,不硬编码在命令里;特殊字符需用单引号包裹。 - 本 skill 只 产生 V1 initial migration 和 seed-data.sql 快照;后续 V2/V3 及业务数据变化由 B 阶段
erp-feature-tdd在 REQ 实现时写入。
参考
${CLAUDE_SKILL_DIR}/templates/migration-v1-header-template.sql${CLAUDE_SKILL_DIR}/templates/seed-data-sql-template.sql- 产物 1:
sql/migrations/V1__initial_schema.sql(由 Flyway 在 Spring Boot 启动时自动 apply) - 产物 2:
sql/seed-data.sql(由开发者选一种方式装载:@Sql / R__seed / data.sql)