navicat 连接 postgresql 后看不到 public 模式下的表,主因是默认仅显示 public 和系统 schema、search_path 导致表建在非 public schema、用户缺少 schema 的 usage 权限,或 navicat 旧版本不兼容 postgresql 15+ 元数据查询。
navicat 连接 postgresql 后看不到 public 模式下的表,绝大多数情况不是连接失败,而是它根本没在 public 模式里找——它正在别的 schema 里找,或者压根没加载该 schema。
Navicat 默认不显示非 public 的 Schema(哪怕你建了表)
Navicat 17+ 默认只展开 public 和系统 schema(如 pg_catalog),其他 schema 即使存在、有表、权限正常,也不会自动出现在左侧对象树里。这不是 bug,是它的默认过滤策略。
- 打开 Navicat → 右键对应 PostgreSQL 连接 → “连接属性” → “高级” → 勾选“显示所有 Schema”
- 或进入“工具” → “选项” → “对象过滤器” → 找到 PostgreSQL 分类 → 确保“显示空 Schema”和“显示所有 Schema”都已启用
- 改完后必须右键连接 → “刷新” 或重启 Navicat,否则不生效
新建表实际建在了非 public 的 Schema 下
你执行 CREATE TABLE users (...) 时,PostgreSQL 不会硬写进 public,而是查 search_path 从左往右找第一个可写的 schema。如果输出是 "$user", public,且当前用户是 crm_user,那表就建在 crm_user schema 下了——而 Navicat 默认根本不展示这个 schema。
- 在查询窗口执行
SHOW search_path;确认当前路径 - 执行
SELECT schema_name FROM information_schema.schemata;看你到底有哪些 schema - 执行
\dn(仅 psql)或SELECT nspname FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema';查非系统 schema - 如果表真在
crm_user下,那就得手动在 Navicat 对象树里展开那个 schema,而不是盯着public
用户没有 USAGE 权限导致 Schema 不可见
Schema 存在 ≠ 用户能看见。PostgreSQL 要求用户对某个 schema 至少拥有 USAGE 权限,Navicat 才会在对象树中列出它(即使里面没表)。
- 用超级用户(如
postgres)执行:GRANT USAGE ON SCHEMA public TO your_user; - 如果表在
analytics下:GRANT USAGE ON SCHEMA analytics TO your_user; - 顺便确认表所属 schema 的
SELECT权限也已授予:GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user; - 注意:
GRANT不会自动应用到未来新建的表,需配合ALTER DEFAULT PRIVILEGES
Navicat 版本与 PostgreSQL 15+ 兼容性问题(表元数据读取失败)
Navicat 16.1 及更早版本在连接 PostgreSQL 15+ 时,会执行含 datlastsysoid 的查询(来自旧版 pg_database),但该字段已在 PG15 中移除,导致元数据加载中断——结果就是连接成功、能执行 SQL、但左侧对象树一片空白。
- 最稳妥方案:升级到
Navicat 16.2+或Navicat for PostgreSQL专用版 - 临时绕过(不推荐):修改
libcc.dll,把 SQL 中的datlastsysoid替换为dattablespace(风险高,易出错) - 验证方式:用
psql或pgAdmin能正常看到表,但 Navicat 左侧为空 → 高概率是此问题
真正卡住人的地方往往不是权限或语法,而是 Navicat 的“默认不显示”和 PostgreSQL 的“默认不写 public”这两层静默行为叠在一起。先查 search_path,再开“显示所有 Schema”,最后补 USAGE 权限——三步做完,90% 的“看不见表”就解决了。











