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

3.8 KiB
Raw Blame History

纯 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 前提交,已发布的历史基线保持不变。