--- 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(source *) 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` 执行(先 `source .env.local` 加载变量): ```bash source .env.local && mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "USE \`$DB_SCHEMA\`; SHOW TABLES;" ``` - **成功** → 记录表列表,继续步骤 C。 - **失败** → 向用户输出具体错误(认证失败 / schema 不存在 / 主机不可达等),提示检查 `.env.local`,**停下**。 ### C. 导出当前 schema 为 V1 initial migration 用 `Bash` 执行 mysqldump(**仅 DDL,不含数据**): ```bash mkdir -p sql/migrations && source .env.local && 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 拼接: ```bash PROJECT="<从 CLAUDE.md 读到的项目名称>" TS="$(date -u +%FT%TZ)" source .env.local { 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**): ```bash source .env.local && 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: ```bash PROJECT="<从 CLAUDE.md 读到的项目名称>" TS="$(date -u +%FT%TZ)" source .env.local { 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 1. 用 `Bash` 执行 `grep -c "CREATE TABLE" sql/migrations/V1__initial_schema.sql` 统计表数量,与步骤 B 记录的表数对比。不一致 → 报错停下。 2. 用 `Bash` 执行 `grep -c "INSERT INTO" sql/seed-data.sql` 统计数据行数: - > 0:正常 - = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续 3. 用 `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]` 4. 输出 `db-init: 完成(schema=<名称>, tables=, V1 migration ✓, seed rows=)`。 5. 立即调用 `Skill(erp-db-design-gen)` 进入 A4,不等用户手动输入。 ## 不变量 - 密码通过 `.env.local` 经 `source` 注入,不硬编码在命令里。 - 本 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)