mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-10-19 22:17:42 +02:00
feat: reconcile SQLite tables and columns at startup
This commit is contained in:
1 parent
8cc575b6ae
commit
7f8dab4ec9
18 files changed
+1669
-1836
No files matched your search
@@ -22,10 +22,14 @@ flowchart LR
|
||||
- 不重建表、不凭空为旧数据编造必填值。SQLite 不支持安全 ADD COLUMN 的主键、唯一约束或缺默认值的必填字段,明确报错并回滚结构补齐事务;修复定义/数据后可重新启动。
|
||||
- 表级约束不自动改变。结构补齐独立于历史数据回填和既有漏洞外键语义迁移;保留外键迁移时应保留额外字段与数据,避免固定列复制造成损失。
|
||||
- 全部结构补齐必须在索引及业务 SQL 之前完成;任一步失败阻止启动。现有连接保持外键配置;内存参考库用单连接并在结束时关闭。
|
||||
- 新字段仅更新 SQL 定义即可,不新增手写补字段列表。历史兼容函数可暂保留供既有测试使用,启动不调用纯字段迁移。
|
||||
- 新字段仅更新 SQL 定义即可,不新增手写补字段列表。删除纯字段迁移列表;既有测试改为验证统一结构补齐。
|
||||
|
||||
## 兼容与验证
|
||||
|
||||
保证已有字段不被改写;默认值用于新列的已有行,未知表/字段保留。针对空库、旧库、重复启动、带引号和复杂默认值、失败回滚、非迁移列表字段、额外字段及外键数据保留做测试。已有时间回填继续保持兼容。
|
||||
|
||||
维护性门禁选择 adapter_extraction:从 1,822 行 database.go 提取静态 DDL 与补齐行为,旧入口薄委托;不进行无关重构。
|
||||
|
||||
## 覆盖检查与维护门禁补充
|
||||
|
||||
全仓库搜索发现处理器另有 HITL 两表与通知已读表,统一移入 application.sql,处理器仅保留数据恢复职责。HITL 文件 1,227 行(high)、通知文件 837 行(medium),只删除静态 DDL 并保留原入口/请求行为,不增加业务复杂度。最终定义覆盖 52 张表(含各数据库文件的同名表)。knowledge 的兼容入口复用同一结构引擎,不再维护字段列表。漏洞历史外键迁移仍按既有语义执行,但基于最新定义、动态复制旧列,保留额外字段、索引、触发器和依赖记录。
|
||||
@@ -7,7 +7,7 @@
|
||||
1. 提取现有初始化后的最终 SQL 到 internal/database/schemas,验证其覆盖所有表及索引。
|
||||
2. 新增 schema_reconcile.go,通过内存参考库与事务实现通用补齐;DDL 分词用于提取准确的列定义。
|
||||
3. 数据库入口改为薄委托,删除启动对纯字段迁移的依赖;保留数据回填,既有漏洞外键迁移保存额外列。
|
||||
4. 添加数据库级回归测试,运行 go test ./internal/database ./internal/knowledge 与 git diff --check。
|
||||
4. 添加数据库级回归测试,运行 go test ./internal/database ./internal/knowledge ./internal/handler ./internal/app 与 git diff --check。
|
||||
5. 更新行为文档及 CHANGELOG,记录验证和提交,推送功能分支;本任务不合并或发布。
|
||||
|
||||
回滚:恢复代码版本;新增表和字段保留,不自动删除;升级前的历史数据不改写。验证使用临时 SQLite 文件,不操作用户实际数据库。
|
||||
@@ -0,0 +1,14 @@
|
||||
# SQLite 启动结构补齐实现记录
|
||||
|
||||
- Phase: F4 complete
|
||||
- Branch: codex/startup-schema-reconcile
|
||||
- 结构来源:internal/database/schemas/*.sql,嵌入二进制。
|
||||
- 自动对比:内存 SQLite 解析最新定义,真实连接事务内创建缺表、补字段、创建缺索引。
|
||||
- 启动入口:NewDB / NewKnowledgeDB,检查失败关闭连接并返回错误。
|
||||
- 处理器中 HITL/通知表定义收敛到统一定义;请求不再临时创建通知表。
|
||||
- 删除 database/RBAC/workflow/knowledge/HITL 的纯字段迁移列表。时间、模型用量、安全拦截和审批等数据回填保留。
|
||||
- 原数据库定义文件从 1,822 行缩减到 270 行;结构与历史语义迁移各自独立。
|
||||
- 原漏洞外键迁移改为从最新定义创建目标表,动态保存额外列及其值,保留索引、触发器和依赖记录;它不是缺字段检查的依据。
|
||||
- 不删除额外表/字段,不自动修改已存在字段类型或约束。不可安全 ADD COLUMN 的定义导致补齐事务回滚,启动失败,附表/字段及原始错误。
|
||||
|
||||
实现验证:go test ./internal/database ./internal/knowledge ./internal/handler 通过;go test ./internal/app 通过;格式整理后 go test ./internal/database 再次通过。
|
||||
@@ -16,10 +16,10 @@
|
||||
| --- | --- | --- |
|
||||
| REQ-001 | 每次启动时对比所有应用管理表的最新定义和实际结构。 | 用户要求 |
|
||||
| REQ-002 | 缺表时自动创建,缺字段时自动补齐,不依赖逐字段迁移列表。 | 用户要求 |
|
||||
| REQ-003 | 主数据库和知识库数据库均执行上述检查。 | 假设,待确认 |
|
||||
| REQ-004 | 已有数据与额外表、字段予以保留;本次不自动删除、重命名字段或修改已有字段类型、约束。 | 假设,待确认 |
|
||||
| REQ-005 | 无法安全补齐时停止启动,并报告表、字段和原因。 | 假设,待确认 |
|
||||
| REQ-006 | 重复启动不重复添加表或字段,结构检查在依赖相关字段的索引创建及业务访问之前完成。 | 假设,待确认 |
|
||||
| REQ-003 | 项目实际使用的 SQLite 数据库文件均执行上述检查,逐文件检查项目定义的所有表。 | 范围边界 |
|
||||
| REQ-004 | 已有数据与额外表、字段予以保留;本次不自动删除、重命名字段或修改已有字段类型、约束。 | 范围边界 |
|
||||
| REQ-005 | 无法安全补齐时停止启动,并报告表、字段和原因。 | 范围边界 |
|
||||
| REQ-006 | 重复启动不重复添加表或字段,结构检查在依赖相关字段的索引创建及业务访问之前完成。 | 范围边界 |
|
||||
|
||||
## 用户场景与验收
|
||||
|
||||
@@ -31,23 +31,23 @@
|
||||
| AC-004 | REQ-005 | 补齐操作失败时服务不开始接收请求,错误明确指出失败位置和原因。 |
|
||||
| AC-005 | REQ-006 | 连续启动两次成功,第二次无重复字段错误,依赖新字段的索引可正常创建。 |
|
||||
|
||||
## 待确认假设与范围
|
||||
## 范围与执行边界
|
||||
|
||||
- “所有表”指项目定义并管理的表,不包含 SQLite 内部表或其他应用自行添加的表。
|
||||
- 本次需求是补齐缺表、缺字段;完整的已有类型、默认值及约束变更不纳入自动修复范围。
|
||||
- SQLite 不能直接添加的字段定义应明确报错,不擅自降低约束或清空已有数据。
|
||||
- 历史数据回填、外键修正等语义迁移仍需保留;它们与缺字段检查是不同职责。
|
||||
- 推荐默认:覆盖主库和知识库、保留已有数据、补齐失败阻止启动。
|
||||
- 执行范围:项目使用的 SQLite 文件、保留已有数据、补齐失败阻止启动。
|
||||
|
||||
## 工作流与维护性检查
|
||||
|
||||
- Workflow Gate:P1 产品契约;后端数据库初始化功能。已有启动入口、建表定义和迁移测试;缺少本功能已确认需求与设计。当前仅允许需求文档,确认后推进设计和实现。
|
||||
- Workflow Gate:P1 产品契约;后端数据库初始化功能。已有启动入口、建表定义和迁移测试;缺少本功能已确认需求与设计。需求已获明确确认,设计和实现允许推进。
|
||||
- 执行范围:数据库启动初始化;不改变对外 API。
|
||||
- Maintainability Gate:database.go 为 1,822 行,风险 high。采用独立模块与薄委托的 adapter_extraction,避免继续在大文件中堆积结构对比逻辑;设计与实现阶段需明确提取边界。
|
||||
- Feature Lifecycle:F0 完成仓库检查,原 main 工作区干净;专用分支 codex/startup-schema-reconcile。F1 待确认。文档为本文件;后续阶段记录设计、实现、验证及变更说明。
|
||||
- Feature Lifecycle:F0 完成仓库检查,原 main 工作区干净;专用分支 codex/startup-schema-reconcile。F1 已确认(2026-10-10 当前对话)。文档为本文件;后续阶段记录设计、实现、验证及变更说明。
|
||||
|
||||
## 确认
|
||||
|
||||
Decision: Confirmed — 用户明确要求按启动对比、缺表补表、缺字段补字段、保留已有数据实施。
|
||||
|
||||
请确认上述需求快照,或指出需要调整的需求 ID。确认后进入设计和实现。
|
||||
用户原文:“对,就按这个改,启动时自动对比 SQLite 最新结构,缺表补表、缺字段补字段,保留已有数据。”
|
||||
Reference in new issue
Block a user