navicat 不支持 postgresql 分区表,因其逆向工程硬编码过滤 relkind ≠ 'r',导致主表(relkind='p')和子表均被忽略;分区键、partition by 语法、继承关系及约束均无法识别,须手动建模或改用 pgadmin/dbeaver。
navicat 对 postgresql 分区表的同步失败,不是配置问题,而是它根本不支持分区表元数据解析 —— 主表 relkind = 'p' 被直接过滤,子表压根不会进模型。
为什么逆向工程完全看不到分区结构
Navicat 15/16 的逆向工程依赖固定 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'(分区索引)。哪怕你连的是最新 PostgreSQL 15,只要底层查询没改,分区信息就进不了模型。
同步时主表存在但子表全丢的真相
- Navicat 模型里只显示主表(因它误判为普通表或手动建的),但
pg_partitioned_table和pg_inherits元数据完全不读 -
PARTITION BY RANGE (ts)、FOR VALUES FROM ('2024-01-01') TO ('2024-04-01')这类定义不会被提取为模型属性 - 子表如
logs_2024_q1不会出现在对象列表中,更不会自动建立继承关系连线 - 导出 DDL 时,
CREATE TABLE ... PARTITION OF ...语句必然缺失,只剩空壳主表
能绕过但不能“修复”的实操路径
别等 Navicat 更新——它没把分区表纳入开发排期。必须人工补全:
- 先用
psql执行\d+ your_partitioned_table,抄下 “Partitions:” 列表和分区键定义 - 在 Navicat 模型中手动创建主表,字段类型、NOT NULL、默认值照抄;再加一个注释字段:
/* PARTITION BY RANGE (ts) */ - 把每个子表当独立表拖进模型,字段名/类型/约束逐条核对(注意:子表不继承主表的 CHECK 约束,得单独建模)
- 外键关系、索引、唯一约束全部手动连线并标注,Navicat 不理解 “子表继承主表约束” 这一语义
真正可用的替代工具选型
如果频繁操作分区表,Navicat 就不该是主力建模工具:
-
pgAdmin 4/5:对象浏览器里有明确的 “Partitioned Tables” 节点,右键 → “Properties” 直接看完整分区树 -
DBEAVER(启用 PostgreSQL 插件后):“Tables” 下展开有 “Partitions” 子节点,双击可查pg_partitioned_table原始数据 - 命令行才是源头:
SELECT pt.*, c.relname FROM pg_partitioned_table pt JOIN pg_class c ON c.oid = pt.partrelid;,结果最准,且不受 GUI 工具限制
实际建模时最容易被忽略的是:Navicat 模型里无法表达“子表继承主表约束”这一逻辑关系,所有 CHECK、DEFAULT、索引都得单独建模,否则导出的 DDL 会漏掉关键约束,上线后可能引发数据一致性风险。











