navicat本身不支持直接提交到git,仅能导出sql脚本供手动提交;必须右键数据库选择“转储sql文件→仅结构”,勾选“添加drop table语句”,取消“包含外键检查禁用语句”,并手动规范文件命名、路径及内容(如去除数据库名前缀),再由人工完成git提交与版本管理。
navicat 本身不支持直接提交到 git
navicat 是数据库客户端工具,不是版本控制系统客户端。它没有内置 git 提交功能,也不会自动生成或管理 sql 迁移文件。你看到的“表结构”只是 gui 界面里的可视化状态,不等于可追踪、可合并、可审查的代码资产。
真正能进 Git 的,只能是文本格式的 SQL 脚本(如 CREATE TABLE 语句)或结构化定义文件(如 JSON/YAML 描述)。Navicat 可以帮你导出前者,但后续流程必须手动或借助外部工具完成。
用 Navicat 导出 DDL 脚本的正确方式
导出时务必选对选项,否则生成的 SQL 不具备可重放性或团队协作友好性:
- 右键数据库 → “转储SQL文件” → “仅结构”(别选“数据和结构”,除非你真要存测试数据)
- 在导出设置中勾选:“添加 DROP TABLE 语句”(避免重复执行报错)
- 取消勾选:“包含外键检查禁用语句”(否则在某些环境会失败,应由部署脚本统一控制)
- 保存为
schema.sql或按表名分拆为users.sql、orders.sql等,路径建议放在项目根目录下的db/migrations/或db/schema/
注意:Navicat 导出的语句默认含数据库名(如 CREATE TABLE `mydb`.`users`),若多人协作或跨环境部署,需手动删掉 `mydb`. 前缀,只保留表名。
为什么不能只靠 Navicat 导出就完事?
单次导出解决不了结构演进问题。比如你改了字段类型、加了索引、删了列——这些变更不会自动变成新 SQL 文件,更不会和已有文件做 diff 或版本关联。
常见踩坑点:
- 多人同时改表,各自导出覆盖了对方的
schema.sql,Git 冲突后无法判断哪次变更该保留 - 线上库被直接修改(没走 Navicat 导出),本地脚本已失效,回滚或重建库时报错
- Navicat 导出的
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4在 MySQL 8.0+ 和 MariaDB 上行为不一致,未显式指定COLLATE可能导致排序异常
真正可持续的做法是:把每次结构变更写成独立的、带序号前缀的 SQL 文件(如 001_add_email_to_users.sql),用脚本或工具(如 flyway、liquibase)按顺序执行,再把这些文件提交进 Git。
最小可行落地建议
不引入复杂工具也能起步:
- 新建目录
db/ddl/,每次结构变更后,用 Navicat 导出对应表的CREATE TABLE语句,保存为ddl/users_v2.sql(v2 表示第二版) - 在 Git 提交信息里明确写清变更原因,例如:
git commit -m "ddl: users_v2.sql - add is_verified BOOL default false" - 写个极简校验脚本
db/check_schema.sh,用mysql -e "SHOW CREATE TABLE users\G"和当前ddl/users_v2.sql做diff,防止手工误操作漏同步
DDL 文件一旦进入 Git,就不再是 Navicat 的附属品,而是团队共有的契约。谁改表,谁负责更新对应文件、写清楚变更点、确保能被他人复现——这个责任边界,Navicat 永远不会替你划清楚。











