Navicat 15模型设计器不支持PostgreSQL分区表,因其仅查询pg_class中relkind='r'的普通表,而分区表relkind='p'被直接过滤;逆向工程同样忽略relkind='p'和'I',导致分区结构、键定义及子表均无法识别。
Navicat 15模型设计器不显示PostgreSQL分区表
navicat 15 的模型设计器(model designer)根本不会识别 postgresql 的原生分区表,不是配置遗漏,而是它压根没实现对 pg_partitioned_table 和相关系统目录的解析逻辑。它只扫描 pg_class 中 relkind = 'r' 的普通表,而分区表在该视图中 relkind 是 'p',直接被过滤掉。你看到的“空”或“只有主表没子表”,是工具能力边界问题,不是连接或权限问题。
为什么逆向工程也看不到分区结构
Navicat 的逆向工程依赖固定 SQL 查询系统表,例如:
SELECT c.oid, c.relname, n.nspname FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r'
这条语句明确排除了 relkind = 'p'(分区表)和 'I'(分区索引)。即使你在连接设置里填了 search_path 或勾选了所有 schema,只要底层查询没改,分区表就进不了模型。
- 分区键定义、
PARTITION BY RANGE/LIST/HASH语法完全丢失 - 子分区表(如
logs_2024_q1)不会出现在对象列表中 - 主表上的
FOR VALUES约束不会被提取为模型属性
替代方案:用 SQL + 手动建模补全
别指望图形界面自动识别。必须分两步走:
- 先用
psql查出完整分区结构:\d+ your_partitioned_table,重点关注 “Partitioned table” 和 “Partitions:” 区域 - 在 Navicat 模型中手动创建主表,并添加一个自定义注释字段,写明分区策略,例如:
/* PARTITION BY RANGE (created_at) */ - 把每个子分区表当作独立实体拖进模型,再手动连线——外键关系、字段类型、NOT NULL 约束都得对照
\d+输出逐条核对
注意:Navicat 不支持在模型中表达“子表继承主表约束”的语义,所有 CHECK、DEFAULT、索引都得单独建模,否则导出 DDL 会漏。
真正能识别分区表的工具选择
如果你频繁操作分区表,Navicat 15 就不该是主力建模工具。实测可用的替代项:
-
pgAdmin 4/5:对象浏览器里明确区分 “Partitioned Tables” 节点,右键可直接查看分区定义 -
DBEaver(需启用 PostgreSQL 插件):在“Tables”下有 “Partitions” 子节点,双击可看pg_partitioned_table元数据 - 命令行:
SELECT * FROM pg_partitioned_table pt JOIN pg_class c ON c.oid = pt.partrelid;—— 这才是最准的源头
Navicat 的模型功能本质是面向传统单表设计的,对 PostgreSQL 10+ 的原生分区支持停留在“看见表名”层面,连分区键字段都拿不到类型信息。真要维护复杂分区架构,图形化建模只能当草稿纸用,核心定义必须回归 SQL。


















