Files
a-share-analysis/docs/features/GOV-012-node-schema-exporter/prd.md
T

69 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 纯 Node.js 开发库 Schema 导出器 PRD
- 功能编号:GOV-012
- PRD 版本:0.1
- 状态:approved
- 日期:2026-08-18
## 背景与问题
当前 `schema:baseline` 依赖本机 MySQL 5.7.x 的 `mysql` 和 `mysqldump` 可执行文件。开发机无法安装这些客户端时,命令在连接数据库前以 `spawnSync mysql ENOENT` 失败,导致上一发布版本无法形成 Schema 基线,后续 `governance:start` 和版本开发流程持续阻断。
项目已经采用 Node.js 22.x、pnpm 和 `mysql2`,不应要求开发机额外安装 MySQL Server,也不应通过 Docker、远程 shell 或非版本化人工导出绕过治理门禁。
## 产品目标
- 使用纯 Node.js 和 `mysql2` 从固定开发库导出完整、确定性、可验证的 Schema。
- 保持 `npm run schema:baseline`、`npm run schema:verify` 和 `governance:start` 的外部用法不变。
- 保留历史 format v1/v2 基线的只读兼容,不重写既有发布证据。
- 在实现完成后生成并推送 `v0.0.9` 基线,恢复自动版本开发流程。
## 范围
- 导出表、索引、外键、视图、触发器、存储过程、函数和 Event Scheduler 事件。
- 新增 format v3 清单,记录 Node 导出器、`mysql2` 驱动和 MySQL 5.7.x 服务端信息。
- 使用开发环境白名单、对象摘要前后校验、SQL 安全扫描、原子写入和 SHA-256 校验。
- 为导出、验证、历史兼容、错误恢复和真实空开发库补充测试。
## 非目标
- 不备份任何表数据。
- 不连接、探测或读取生产数据库。
- 不安装 MySQL Server、MySQL CLI、Docker 或远程导出服务。
- 不修改业务数据库结构、迁移、实体或应用查询。
- 不把 TypeORM 实体定义当作现有数据库真实结构的替代品。
## 用户流程
1. 开发者在开发下一版本前运行 `npm run schema:baseline`。
2. 工具固定读取 development 配置并验证目标库边界。
3. Node 导出器连接开发库、读取完整对象定义并生成版本目录。
4. 开发者运行 `npm run schema:verify`,提交并推送该目录。
5. `governance:start` 核对基线、远程分支和发布标签后允许下一功能开发。
## 成功指标
- 未安装 `mysql` 和 `mysqldump` 的开发机能够完成真实 Schema 基线生成。
- 相同结构重复导出产生逐字节一致的 SQL 和 SHA-256。
- format v1/v2 历史基线继续通过原有验证。
- 空开发库生成 `captured_empty`,非空开发库生成完整 `schema.sql`。
- 失败时不留下目标版本目录或半成品。
## 验收标准
- Given 本机不存在 MySQL CLI,When 执行 `schema:baseline`,Then 工具通过 `mysql2` 连接固定开发库且不调用外部数据库命令。
- Given 数据库包含所有受支持对象,When 导出完成,Then SQL 包含完整对象定义且不包含数据、凭据和 `DEFINER`。
- Given 历史 format v1/v2 基线,When 执行 `schema:verify`,Then 继续按原规则通过或失败,文件不被重写。
- Given 导出期间对象摘要变化,When 执行完成前复核,Then 命令失败并清理临时目录。
- Given `v0.0.9` 基线已提交推送,When 执行 `governance:start`,Then 不再因本机缺少 MySQL CLI 被阻断。
## 风险
- `SHOW CREATE` 权限不足会阻断完整导出,必须明确报错,不能跳过对象。
- 视图依赖和例程分隔符处理错误会降低恢复能力,必须用固定夹具和恢复顺序测试覆盖。
- 本功能位于版本治理关键路径,任何历史兼容回归都可能阻断全部后续开发。
## 发布与回退
GOV-012 作为独立治理版本发布。若新导出器不能生成确定性完整结构、历史基线验证回归或 `governance:start` 无法恢复,则不得发布;代码回退到 GOV-012 前提交,已发布的历史基线保持不变。