技术架构 · v7.3.2 · 2026-10-27
OntoL MySQL8 技术架构
本体推理平台的业务数据迁入 MySQL8 之后的分层视图:一套业务代码,两个物理隔离的数据底座,外加图与向量两类专用存储。
业务库MySQL8 · ontol · 87 张表系统库SQLite · ontol_sys.db · 14 张表API 路由模块26后端DB_TYPE=mysql
FastAPI 0.115 · Uvicorn · Python 3.14 · LangChain 0.3 · LangGraph 0.3 · PyMySQL · Memgraph MAGE · ChromaDB 1.5 · Redis 7 · ReactFlow 11 · Alpine.js
分层运行视图
请求自上而下穿过六层
页面只发 HTTP 与 SSE;网关只做鉴权与序列化;智能体通过工具调用进入业务域;业务域只在数据访问层接触 SQL。跨层调用一律走 Python 函数,不做内部 HTTP。
L1访问层浏览器 · 零构建管理页面Jinja2 · Alpine.js · jQuery图编辑画布ReactFlow · GraphSidebarAI 对话面板SSE 流式 · 工具卡片行业场景页经营 · ERP · 库存 · 指标HTTPS · EventSourceL2网关层单进程 · 无业务逻辑FastAPI · Uvicorn:8000 · 26 个 API 路由认证中间件JWT · RBAC · 401 跳登录响应序列化SafeJSONResponse · 雪花 ID→串流式与静态资源SSE · /static 四路挂载POST /api/v1/chat · tool_modeL3智能体层ReAct · 提示词注入orchestratorLangGraph 工作流编排对话 AgentReAct · 13 工具 · 场景技能提示词与知识注入business/prompts · 本体规范LLM 网关llm_manage · 配置驱动工具调用 · 不走内部 HTTPL4业务域一域一模块__init__ 即接口本体与场景ontology · domain_model · scene_catalog推理与副本reasoning · sandbox_wargame · DSL智能生成auto_manage · upload · coverage数据与管道datamanage · dataPipeline · metric治理与审计governance · audit · runtime_log平台管理security · project · ai_manageService / RepoL5数据访问驱动抽象SQL 只在此层DatabaseDriverget_driver / get_sys_driverBaseRepository对象 ↔ SQL 映射MySQLDriver连接池 ×8 · to_thread方言翻译 + 兼容层sql_mysql_dialect · compatSQL · Cypher · 缓存命令L6存储四类存储职责不重叠MySQL8 · ontol87 张业务表 · utf8mb4_binSQLite · ontol_sys.db14 张 RBAC 表 · 始终 SQLiteMemgraph MAGE原始本体 + 推理副本 · :7687ChromaDB本体知识 + 情景记忆 · 嵌入式Redis数据源缓存 · 降级进程内存LLM 服务DeepSeek / OpenAI 兼容 API
本次升级新增或改写 沿用组件 箭头表示同步调用,SSE 事件沿同一路径回传。业务表与系统表分属两个物理库;图与向量存储各自独立,互不兜底。
数据底座
同一套 SQL,两个数据库
业务代码继续按 SQLite 语法书写,由底座在驱动内翻译执行。切换 MySQL 只改 DB_TYPE,业务 Repo 零改动;系统管理库则固定留在 SQLite,不随后端切换。
业务库 · DB_TYPE=mysql系统库 · 始终 SQLite业务域 Repo(30+ 个业务模块)SQLite 语法 SQL + ? 占位符db_driver.get_driver()DatabaseDriver 工厂(单例)sqlite / mysql / oracle 三实现DB_TYPE 决定实现MySQLDriver · 连接池 ×8同步借还 · 异步 asyncio.to_thread执行前翻译sql_mysql_dialect + mysql_compat方言翻译 · sqlite3 风格游标 / Rowpymysql · InnoDB · utf8mb4_binMySQL8 · ontol · 87 张业务表127.0.0.1:3307 · Mysql8-ontol-admin本次升级新增的底座系统管理 Repo用户 / 角色 / 权限 / 菜单 / 部门 / 日志get_sys_driver()SQLiteDriver不读 DB_TYPE · 不受业务库切换影响本地文件SQLite · ontol_sys.db · 14 张表infrastructure/db/ontol_sys.db业务库与系统库物理隔离:RBAC 数据不随业务库迁移,迁移脚本也不覆盖系统库。
迁移由 scripts/migrate_business_data_to_mysql.py 完成:调用建表迁移补齐结构,再按 500 行一批 REPLACE INTO 覆盖写入,最后逐表核对行数;重复执行安全。
方言翻译(不支持的语法显式报错,不静默降级)
- ? → %s
- "col" → `col`
- datetime('now') → NOW()
- INSERT OR IGNORE → INSERT IGNORE
- INSERT OR REPLACE → REPLACE
- ON CONFLICT → ON DUPLICATE KEY UPDATE
- rowid → `id`
- last_insert_rowid() → LAST_INSERT_ID()
- a || b → CONCAT(a, b)
- CAST AS TEXT → CAST AS CHAR
- sqlite_master → 兼容模拟
- CREATE TRIGGER → 跳过
类型映射
- TEXT → LONGTEXT
- INTEGER → BIGINT
- REAL → DOUBLE
- NUMERIC → DECIMAL(24,6)
- BOOLEAN → TINYINT(1)
- DATETIME → VARCHAR(64)
升级要点
改了底座,没改业务
升级集中在数据访问层与运维侧,业务模块、接口字段、前端页面保持一致。下面每一行都对应一个可以直接打开的源文件。
| 位置 | 职责 | 升级后的行为 |
|---|---|---|
| infrastructure/db/sql_mysql_dialect.py | 方言翻译 | 执行前把 SQLite 语法改写为 MySQL 等价语句;CREATE TABLE 做类型映射、去外键、去表达式默认值。 |
| infrastructure/db/mysql_compat.py | 兼容连接与连接池 | 提供 sqlite3 风格的连接、游标与行对象,模拟 sqlite_master 与 PRAGMA table_info;池上限 8,断线 ping 重建。 |
| infrastructure/db/drivers/mysql_driver.py | 驱动实现 | 实现 DatabaseDriver 协议;异步接口转线程执行不阻塞事件循环,显式事务独占一条连接。 |
| infrastructure/db/db_driver.py | 驱动工厂 | get_driver() 按 DB_TYPE 返回单例;get_sys_driver() 固定 SQLite。 |
| scripts/migrate_business_data_to_mysql.py | 数据迁移 | 幂等:建表补列建索引,再 500 行一批 REPLACE INTO,最后逐表核对行数。 |
| ENABLE_SECONDARY_INDEXES | 索引策略 | 当前关闭,MySQL 侧只保留主键聚簇索引;唯一性由应用层保证,出现卡顿再按 SQLite 索引定义补建。 |
| infrastructure/db/projects/<id>/ontol.db | 项目业务库 | 新建项目仍自动开通独立 SQLite 库并登记为数据源,不参与运行时路由,供数据管理与迁移使用。 |
一次推演的完整路径
数据在六层之间怎么走
以副本推演为例,一次请求经过鉴权、场景门禁、克隆、DSL 执行与写回,每个环节的数据落点都不同。
- 页面发
POST /api/v1/chat,全局 fetch 拦截自动注入 Bearer token;响应是 SSE 流。 - 网关AuthMiddleware校验 JWT,加载权限码(进程内缓存 60 秒),注入请求上下文。
- 推理前过场景门禁:
scene_id存在、场景已启用、已配置推理规则,缺一项就拒绝。 - Agent 选路径后由推理机在副本空间克隆节点与边,分配新的雪花 ID,
ontoL_source_id指回原始元素。 - 逐节点执行 precondition、逐边执行 condition 与 execution,DSL 结果写回
precondition_val/msg等字段,全部落 Memgraph。 - 配置、会话、运行日志、推理证据落MySQL8;卡片与日志经 SSE 回到页面,原始图始终保持只读。
部署拓扑
一个镜像,两种跑法
应用容器只依赖外部数据服务;同一镜像在单机用 docker run 启动,在集群由启动命令区分为 gateway、worker、scheduler 三种角色。
宿主机 · Docker Desktop容器 · ontol-appFastAPI · Uvicorn:8000 · 页面 · API · SSEChromaDB应用内嵌 · 本地持久化目录mysql://bolt://redis://MySQL8 · ontolMysql8-ontol-admin · :3307Memgraph MAGE图数据库 · :7687Redis 7:6379 · 未启动时降级进程内存host.docker.internal 指向宿主机;Linux 需加 --add-host。原始图与副本空间同库,以 ontoL_copy_version 区分。
集群侧:deployments/k8s/ 提供 gateway、worker、scheduler 三个 Deployment 与 HPA、Ingress;镜像保持单份,角色由启动命令切换。外部 LLM 通过配置的 OpenAI 兼容地址访问,密钥加密存 MySQL。
依据ARCHITECTURE.mdDB_SCHEMA.mdCLAUDE.mdinfrastructure/db/*v7.3.2 · 2026-10-27