navicat 16 不支持直接 git push,因其非 git 客户端,无法自动提交数据库变更;必须人工将 ddl/dml 导出为带日期和描述的 sql 文件(如 20260907_add_user_status.sql),放入 migrations/ 目录后手动执行 git add、commit、push。

Navicat 16 本身不支持将数据库变更(如表结构修改、数据增删)直接“推送”到 Git 仓库——它不是版本控制客户端,也没有内置 Git 提交/推送能力。
Navicat 16 没有 git push 功能
你无法在 Navicat 界面里点击某个按钮,就把当前连接的 MySQL 或 PostgreSQL 数据库“一键同步到 GitHub”。它的「协作」功能只同步项目内元数据(如连接配置、查询语句),不捕获或导出数据库的实际变更快照。
常见误解场景:
- 误以为右键表 → 「设计表」改了字段后,点一下「保存」就能生成 migration 脚本并提交到 Git
- 以为「导出向导」选了 SQL 格式,就等于完成了可复现、可 review 的版本化交付
实际上:导出的 SQL 是一次性结果,不含上下文(比如是基于哪次 commit 改的)、没带作者/时间戳、没做 diff、也没和 Git 分支对齐。
真正可行的推送路径:SQL 脚本 + 手动 Git 操作
把数据库变更变成 Git 可管理的内容,必须经过人工提取、格式化、归档三步。核心是让每次变更对应一个明确的 .sql 文件,并由开发者自己执行 git add / git commit / git push。
实操建议:
- 用 Navicat 的「查询」窗口写 DDL/DML:例如
ALTER TABLE users ADD COLUMN status VARCHAR(20);,保存为20260907_add_user_status.sql - 导出时选「PostgreSQL」或「MySQL」格式(不是通用 SQL),避免 NULL 和布尔值转义错误
- 导出文件名带日期+简要描述,例如
20260907_fix_invoice_amount_type.sql,方便 Git 历史追溯 - 把导出的
.sql文件放入项目根目录下的migrations/或sql/子目录,再用终端执行:git add migrations/20260907_*.sql - 提交信息写清楚影响范围,例如:
feat(db): add status column to users table, required for auth flow
为什么不能依赖 Navicat 自动导出 + 推送?
因为自动导出行为不可控、不可审计:
- 导出向导不记录“从哪个版本改起”,同一个表多次导出会覆盖历史,Git 无法看出增量变化
- 字段映射、编码、空值处理等选项全靠鼠标勾选,没有配置文件留存,下次重做极易漏项
- Navicat 不生成带 SHA 或版本号的脚本,也无法校验导出内容是否与目标环境一致(比如 dev 导出的 SQL 在 prod 执行前缺了
BEGIN TRANSACTION) - 它不检查语法兼容性——MySQL 的
ENGINE=InnoDB会被原样导出,但放到 PostgreSQL 里直接报错
换句话说:Navicat 是操作数据库的工具,不是数据库变更的版本化管道。真正需要被 Git 管理的,永远是你手写的、带上下文的、可测试的 SQL 脚本,而不是图形界面里点出来的临时产物。











