Files
CyberStrikeAI/docs/feature/startup-schema-reconcile/requirements.md
T

54 lines
3.7 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.
# 启动时自动补齐数据库结构
- Status: Confirmed
- Created: 2026-10-10
- Source: 用户要求启动时自动对比所有表的最新结构,缺表、缺字段自动补齐,不依赖迁移代码列出的字段。
- Confirmed by: 用户(当前对话)
- Confirmation date: 2026-10-10
## 问题与目标
当前会创建缺表,但只检查手写迁移列表中的字段。希望以项目最新表结构定义为依据,在服务接收请求之前检查所有应用管理的表,自动补齐缺表、缺字段。以后新增字段只需更新最新表结构定义,无需再维护同一字段的补齐迁移列表。
## 功能需求
| ID | 需求 | 来源 |
| --- | --- | --- |
| REQ-001 | 每次启动时对比所有应用管理表的最新定义和实际结构。 | 用户要求 |
| REQ-002 | 缺表时自动创建,缺字段时自动补齐,不依赖逐字段迁移列表。 | 用户要求 |
| REQ-003 | 项目实际使用的 SQLite 数据库文件均执行上述检查,逐文件检查项目定义的所有表。 | 范围边界 |
| REQ-004 | 已有数据与额外表、字段予以保留;本次不自动删除、重命名字段或修改已有字段类型、约束。 | 范围边界 |
| REQ-005 | 无法安全补齐时停止启动,并报告表、字段和原因。 | 范围边界 |
| REQ-006 | 重复启动不重复添加表或字段,结构检查在依赖相关字段的索引创建及业务访问之前完成。 | 范围边界 |
## 用户场景与验收
| ID | 关联需求 | 验收标准 |
| --- | --- | --- |
| AC-001 | REQ-001、REQ-002、REQ-003 | 空数据库启动后具备最新定义中的全部应用表和字段。 |
| AC-002 | REQ-001、REQ-002 | 旧数据库缺少最新定义中的表或字段时,启动后自动补齐,即使该字段没有手写迁移。 |
| AC-003 | REQ-004 | 补齐后原有数据和额外字段、表仍存在。 |
| AC-004 | REQ-005 | 补齐操作失败时服务不开始接收请求,错误明确指出失败位置和原因。 |
| AC-005 | REQ-006 | 连续启动两次成功,第二次无重复字段错误,依赖新字段的索引可正常创建。 |
## 范围与执行边界
- “所有表”指项目定义并管理的表,不包含 SQLite 内部表或其他应用自行添加的表。
- 本次需求是补齐缺表、缺字段;完整的已有类型、默认值及约束变更不纳入自动修复范围。
- SQLite 不能直接添加的字段定义应明确报错,不擅自降低约束或清空已有数据。
- 历史数据回填、外键修正等语义迁移仍需保留;它们与缺字段检查是不同职责。
- 执行范围:项目使用的 SQLite 文件、保留已有数据、补齐失败阻止启动。
## 工作流与维护性检查
- Workflow Gate:P1 产品契约;后端数据库初始化功能。已有启动入口、建表定义和迁移测试;缺少本功能已确认需求与设计。需求已获明确确认,设计和实现允许推进。
- 执行范围:数据库启动初始化;不改变对外 API。
- Maintainability Gate:database.go 为 1,822 行,风险 high。采用独立模块与薄委托的 adapter_extraction,避免继续在大文件中堆积结构对比逻辑;设计与实现阶段需明确提取边界。
- Feature Lifecycle:F0 完成仓库检查,原 main 工作区干净;专用分支 codex/startup-schema-reconcile。F1 已确认(2026-10-10 当前对话)。文档为本文件;后续阶段记录设计、实现、验证及变更说明。
## 确认
Decision: Confirmed — 用户明确要求按启动对比、缺表补表、缺字段补字段、保留已有数据实施。
用户原文:“对,就按这个改,启动时自动对比 SQLite 最新结构,缺表补表、缺字段补字段,保留已有数据。”