db_path_normalization_20260715

数据库路径归一与旁路最终闭环(2026-07-15 第三轮)

第三步执行:路径归一补全

发现

全量扫描 server 运行时目录(core/routes/services/digital-staff/utils/middleware/shared/boss-scheduler)所有 .db 路径构造与驱动实例化。

真实物理库名(出现于 createDatabase 参数)全部已在 KNOWN_DBS 覆盖:

rule_engine.db / sciot_import.db / core_runtime.db / enterprise_store.db / aml_store.db / aml.db / sccapp_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.dbconfig.db 属性访问),非 createDatabase('xxx.db') 真实文件名参数,不属路径归一范围。

改动

  • server/sqlite-compat.js L36:KNOWN_DBS 补入 ai_tasks.db → 无论调用方传 './server/data/ai_tasks.db''server/data/ai_tasks.db' 均归一化到 server/data/ai_tasks.db,消除未来建库时的幽灵路径风险。

两个驱动级旁路的最终裁定(不强行改)

全量扫描发现 3 类驱动实例化绕过 compat 单例:

  1. sql.js 内存副本ai-inspector.js:49(getSciotDb 用 sql.js 缓存,TTL 只读快照)、routes/scripts/*.js(构建/迁移脚本,非运行时)
  2. sqlite3 原生驱动services/ai-task-manager.js:28(第 3 种驱动,写 ai_tasks.db)
  3. mysql2unified-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 磁盘不存在 → 实际走 useMemory Map 降级,无磁盘数据风险。改写需重写 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/health 200、/api/rule-engine/stats = {total:2413, active:2386}
  • 引擎初始化日志:无 dead/unsupported 告警、无 FAIL
  • 单例复用(上轮已验):sccapp_process_data.db 缓存键=1,跨包装器读写同一底层数据成功
  • KNOWN_DBS 覆盖:所有真实物理库名闭环

遗留 tech-debt(独立排期,非紧急)

  1. ai-task-manager.js:sqlite3 回调风格 → compat 同步风格改写(当前内存降级,无数据风险)
  2. ai-inspector.js:sql.js 只读缓存 → 评估改为 compat 单例读(消除内存副本,但需改巡检 UI 核心路径)
  3. 310 个良性空 catch 分类审计(整洁度,非数据层病根)
  4. 14 个 .db 文件未物理合并(逻辑归一已完成,物理合并是独立架构债)
← 返回案例列表
分享:
🤖 Try Now →
🤖
🎁