Navicat逆向工程默认只扫描public模式,导致非public schema的表、外键、注释等无法识别;需显式配置search_path、取消“Only show objects in current schema”、授予权限并避免大小写敏感schema名。
pg_dump 不会导出 schema 关系,navicat 的逆向工程依赖的是 postgresql 系统目录的查询逻辑,而它默认只扫描 public 模式 —— 这就是你勾选了其他 schema 却看不到表、关系或外键的最常见原因。
Navicat 逆向工程只显示 public 模式下的对象
Navicat 在执行“从数据库逆向工程”时,并非简单地列出所有 schema,而是按固定 SQL 查询系统表(如 pg_class、pg_namespace、pg_constraint),且其 WHERE 条件默认限定 n.nspname = 'public'。即使你在连接设置里填了 search_path,或在逆向窗口手动勾选了 myschema,只要该 schema 没被显式加入查询上下文,表和约束就不会被识别。
常见错误现象:
- 勾选了多个 schema,但生成的 ER 图里只有
public下的表 - 自定义 schema 中的外键关系完全丢失(Navicat 标记为 “no foreign key”)
- 表名能列出来,但字段类型、注释、主键标识全为空
解决方法:
- 确保目标 schema 已被
CREATE SCHEMA显式创建,且当前连接用户对该 schema 有USAGE权限 - 在 Navicat 连接配置中,进入 高级 → Options,在
search_path字段填入完整路径,例如:myschema,public(注意顺序:优先级从左到右) - 逆向工程窗口中,必须**取消勾选 “Only show objects in current schema”**(这个选项默认常被误启)
- 若仍无效,临时将目标 schema 设为用户默认 schema:
ALTER USER your_user SET search_path TO myschema,public;
外键跨 schema 时 Navicat 无法解析关系
PostgreSQL 允许外键引用其他 schema 的表(如 myschema.users.id → logs.public_ref_id),但 Navicat 的逆向引擎默认只查当前 schema 内的 pg_constraint 记录,且不自动 JOIN 多 schema 的 pg_class。结果就是外键字段存在,但“Referenced Table” 和 “Referenced Column” 显示为空或乱码。
使用场景:
- 微服务拆分后,日志库、权限库、业务库分属不同 schema
- 使用
extensions(如postgis)时,函数/类型来自public或extensionsschema,但主业务表在app
实操建议:
- 不要依赖 Navicat 自动识别跨 schema 外键;先用 psql 手动验证:
\d+ myschema.mytable看 constraint 定义是否完整 - 在逆向前,运行一次:
SET search_path TO myschema,public,extensions;(需 Navicat 支持执行初始化 SQL,见连接高级设置) - 若 schema 数量少且稳定,可逐个 schema 单独逆向,再手动合并 ER 图
Navicat 对大小写敏感 schema 名的处理缺陷
PostgreSQL 中,用双引号创建的 schema 名是大小写敏感的(如 "MySchema"),而 Navicat 在逆向时会把所有 schema 名转为小写再匹配,导致 "MySchema" 被当成 myschema 查不到,最终跳过整个 schema。
参数差异与影响:
-
pg_hba.conf或连接字符串中的大小写不影响此问题,这是 Navicat 内部 SQL 构造逻辑缺陷 - Navicat 15–16.3 版本普遍存在该 bug;17.0+ 修复部分 case,但仍对带特殊字符(如
"user-data")的 schema 失效 - 性能影响:Navicat 会为每个“找不到”的 schema 多发一次空查询,拖慢整体逆向速度
绕过方式:
- 重命名 schema 为全小写无符号版本:
ALTER SCHEMA "MySchema" RENAME TO myschema; - 改用
pg_dump --schema-only+psql导出 DDL,再用文本工具提取关系 - 换 DBeaver:它对 quoted identifier 的兼容性更好,且支持自定义逆向 SQL 模板
逆向后缺失注释和扩展类型信息
Navicat 默认不会查询 pg_description 表获取字段/表注释,也不加载 pg_type 中的扩展类型(如 citext、ltree、hstore),导致生成的模型里全是 unknown 或 text。
容易踩的坑:
- 勾选了 “Include comments” 但没生效 —— 实际上该选项只对
publicschema 生效 - 安装了
postgis,但 Navicat 逆向后地理字段显示为bytea,而非geometry - 自定义 enum 类型被识别为
USER-DEFINED,无法参与建模
关键动作:
- 在连接的 高级 → Options 中,手动添加
options=-c default_transaction_read_only=off(某些扩展需读写上下文) - 确保连接用户拥有
SELECT权限到pg_description和所有相关pg_*系统表(极少见,但企业环境可能受限) - 对含扩展类型的 schema,逆向前先执行:
SET LOCAL client_min_messages = 'warning';防止扩展初始化报错中断流程
真正卡住多数人的,不是“能不能连上”,而是“连上了却看不见关系”。Navicat 的逆向逻辑是静态 SQL 驱动的,它不会动态适配你的 schema 组织方式 —— 你得提前把它“喂”对上下文,否则它就只认 public。


















