Navicat模型历史只能通过XML+Git归档实现,因.nmodel文件无版本记录、On-Prem Server仅存最新副本且不保存diff;必须坚持每次修改后导出带语义化版本号的XML并提交至Git/models/目录,同时手动规范外键名、启用SQL注释导出、设置MySQL目标版本以确保归档有效性。

Navicat 模型工作区(.nmodel)本身不保存版本历史,所谓“历史”只存在于你导出的 XML 文件提交记录里——归档动作必须在 Git 或其他 VCS 中完成,Navicat 客户端不提供任何内置版本导出功能。
为什么不能从 Navicat On-Prem Server 直接导出模型版本历史
Navicat On-Prem Server 的“模型工作区”是中心分发点,但它只存当前最新副本,不保留变更快照。每次同步只是覆盖本地 .nmodel 文件,服务器侧不记录 diff、不存时间戳、不提供历史回溯界面。你看到的“活动日志”只记录谁在什么时候点击了“同步”,不记录结构改了哪一行。
常见错误现象:git log --oneline models/user_service.xml 显示 12 次提交,但 navicat on-prem server 界面里找不到对应“第 7 版”模型下载入口。
- Navicat 不把 XML 当作“源文件”管理,它只用 XML 做导入/导出媒介
- 服务器不解析 XML 内容,也不校验结构一致性,只做二进制文件托管
- 若多人跳过 XML 直接改本地 .nmodel 并同步,Git 提交里会出现大量无意义的二进制变更,无法归档有效历史
真正可归档的模型历史只能来自 XML + Git
归档有效性取决于你是否坚持“所有模型变更都走 XML 流程”。只要团队守住这条线,历史就是天然可追溯的。
实操建议:
- 每次模型修改后,右键模型工作区 →
Export Model to XML,保存为models/order_v2.3.xml(带语义化版本号) - XML 文件必须提交到 Git 仓库的
/models/目录下,禁止放入/tmp/或桌面等临时路径 - 提交信息写清楚变更点,例如:
feat(model): add created_at column to users table - 用
git diff HEAD~1 HEAD -- models/*.xml快速比对结构差异,重点关注、和节点增删
导出归档时必须清理三类默认陷阱
即使 XML 可读,原始导出内容仍含干扰项,直接归档会导致 Git 噪音大、diff 失效、协作成本飙升。
导出前务必手动处理:
-
fk_abc123类自动生成的外键名:在模型编辑器中双击每个外键,手动设为固定名,如fk_user_profile_user_id - 字段注释未转 SQL 注释:确保导出选项勾选
Export comments as SQL comments,否则-- @desc不会出现在 XML 的节点里 - MySQL 版本兼容性标记缺失:在模型属性中显式设置
Target MySQL Version = 8.0,否则 XML 中不会出现type="JSON"这类关键约束,归档后无法还原真实 DDL 行为
归档不是一次性的导出动作,而是持续维护 XML 提交链的过程。最容易被忽略的一点是:Navicat 从不校验你提交的 XML 是否能被正确逆向工程回来——如果某次导出漏了 Use IF NOT EXISTS,又没清理掉 Include DROP TABLE,归档文件看似完整,但下次 CI 流水线执行 mysql -e "source model.sql" 时可能直接清空生产表。











