数据库路径归一与旁路最终闭环(2026-07-15 第三轮)
第三步执行:路径归一补全
发现
全量扫描 server 运行时目录(core/routes/services/digital-staff/utils/middleware/shared/boss-scheduler)所有 .db 路径构造与驱动实例化。
真实物理库名(出现于 createDatabase 参数)全部已在 KNOWN_DBS 覆盖:
rule_engine.db / sciot_import.db / bossagents.db / enterprise_store.db / aml_store.db / aml.db / pps_process_data.db / plm_doc_brain.db / sciot-metadata.db / boss_analytics.db / boss_tenants.db / user_libraries(目录) / ai_tasks.db(本轮补入)
验证脚本误报说明: _verify_known_dbs.js 正则抓到的 config.db/store.db/svc.db/this.db/d.db 等 19 个"MISS"实为代码变量名(this.db、config.db 属性访问),非 createDatabase('xxx.db') 真实文件名参数,不属路径归一范围。
改动
server/sqlite-compat.jsL36:KNOWN_DBS补入ai_tasks.db→ 无论调用方传'./server/data/ai_tasks.db'或'server/data/ai_tasks.db'均归一化到server/data/ai_tasks.db,消除未来建库时的幽灵路径风险。
两个驱动级旁路的最终裁定(不强行改)
全量扫描发现 3 类驱动实例化绕过 compat 单例:
- sql.js 内存副本:
ai-inspector.js:49(getSciotDb 用 sql.js 缓存,TTL 只读快照)、routes/scripts/*.js(构建/迁移脚本,非运行时) - sqlite3 原生驱动:
services/ai-task-manager.js:28(第 3 种驱动,写 ai_tasks.db) - mysql2:
unified-asset-service.js:46(外部 MySQL,本就不在 sqlite 归一范围)
裁定:
ai-inspector.js的 sql.js 缓存 = 只读快照语义(TTL + 只查不写),与 better-sqlite3 单例不冲突数据,仅多一份额外内存副本(性能权衡)。下游强耦合sdb.exec(...)sql.js 专属 API,改写需改巡检 UI 核心路径,风险高且无数据覆盖风险 → 标记 tech-debt,不阻塞。ai-task-manager.js的 sqlite3 驱动 = API 不兼容(回调风格db.run(sql, cb)vs compat 同步风格)。当前ai_tasks.db磁盘不存在 → 实际走useMemoryMap 降级,无磁盘数据风险。改写需重写 init + 11 处回调调用 + 调用方 await 语义,工作量 372 行 → 单独排期,不强行塞入本轮(避免回归)。- mysql2 外部库:非 sqlite 归一对象,正常。
三步法最终落地汇总
| 步 | 范围 | 结果 |
|----|------|------|
| 第一步 止血 | 数据层关键 catch 日志化 | ✅ rule-engine 466/3040/3045 加 error 日志(不重抛) |
| 第二步 堵旁路 | 两个真实单例旁路 | ✅ self-evolving-pipeline(L32) + rule-engine 元数据恢复(L313) 改走 compat 单例 |
| 第三步 路径归一 | KNOWN_DBS 补全 | ✅ 补 ai_tasks.db,所有真实物理库名已覆盖 |
未做(经核实不应做):
- 不改 310 个良性空 catch(fs 类/JSON 解析回退/表未建预期)——改了会让正常工况崩溃
- 不改写 ai-inspector sql.js 只读缓存(API 不兼容 + 无数据风险)
- 不强行改 ai-task-manager sqlite3(API 不兼容 + 当前内存降级无风险)——已排期独立任务
- 不新建 db-registry.js(canonicalPath 已是单一事实源)
- 不换驱动(better-sqlite3 已就位)
验证
- 服务干净重启(清场孤儿 9876):
/api/health200、/api/rule-engine/stats= {total:2413, active:2386} - 引擎初始化日志:无 dead/unsupported 告警、无 FAIL
- 单例复用(上轮已验):pps_process_data.db 缓存键=1,跨包装器读写同一底层数据成功
- KNOWN_DBS 覆盖:所有真实物理库名闭环
遗留 tech-debt(独立排期,非紧急)
ai-task-manager.js:sqlite3 回调风格 → compat 同步风格改写(当前内存降级,无数据风险)ai-inspector.js:sql.js 只读缓存 → 评估改为 compat 单例读(消除内存副本,但需改巡检 UI 核心路径)- 310 个良性空 catch 分类审计(整洁度,非数据层病根)
- 14 个 .db 文件未物理合并(逻辑归一已完成,物理合并是独立架构债)
BossAgents