用 pg_dump + pgmodeler 导出 PostgreSQL 的 ER 图 PDF 最稳:pgmodeler 解析元数据重建逻辑模型后矢量渲染,支持直连数据库或导入 pg_dump -s SQL 文件,需 Arrange model 自动布局并设置中文字体。
用 pg_dump + pgmodeler 导出 PostgreSQL 的 ER 图 PDF 最稳
postgresql 自身不带 er 图导出功能,pg_dump 只能导结构文本,真正要生成带关系连线、表分组、可打印的 pdf,得靠 pgmodeler 这类专用建模工具。它不是简单“截图”,而是解析数据库元数据后重建逻辑模型,再渲染导出——所以必须连上真实数据库(或至少有 pg_dump --schema-only 生成的 sql 文件供其导入)。
常见错误是直接拿 Navicat 或 DBeaver 的“ER 图”右键导出,结果发现 PDF 里只有模糊截图、没字体、缩放失真,甚至关系线错位。那只是界面快照,不是矢量模型输出。
-
pgmodeler支持从连接串直连(推荐开发/测试库),也支持导入pg_dump -s输出的 SQL 文件(适合生产库只给 DDL 的场景) - 导出 PDF 前务必点一下
Arrange model(自动布局),否则表堆叠、连线打结,PDF 里根本看不清 - 中文表名/字段名需在
Preferences → General → Default font中选支持中文的字体(如 Noto Sans CJK),否则 PDF 里显示方块
MySQL 要导 ER PDF,别碰 mysqldump,用 MySQL Workbench 的 Catalog 抓取
mysqldump --no-data 只给 CREATE TABLE 语句,Workbench 却能通过 JDBC 连接实时读取 INFORMATION_SCHEMA 和外键约束,还原出完整依赖关系。这是它能画准 ER 图的根本原因——不是靠解析 SQL 文本猜的。
容易踩的坑:勾选了 Generate Physical Diagram 却忘了点 Place in Diagram,结果导出 PDF 是空页;或者用了旧版 Workbench(
- 必须用 Workbench 连上目标库后,在
Database → Reverse Engineer...流程走完,不能跳过“Place in Diagram”步骤 - 导出前在图上右键 →
Export as PNG/PDF,选 PDF 时注意勾上Scale to fit page,否则 A4 打印时内容被裁掉 - 如果库有上百张表,先在
Catalog面板里用文件夹分组(右键 Schema →Create Folder),导出 PDF 前只展开需要的分组,避免图过大糊成一片
Oracle 导 ER PDF 最省事的路:SQL Developer Data Modeler 的“Import from Database”
SQL Developer 自带的 Data Modeler 模块比独立客户端更轻,且对 Oracle 元数据兼容性最好——它直接查 ALL_CONSTRAINTS、ALL_CONS_COLUMNS,连物化视图日志、分区键都能识别出来。而第三方工具常把 REF 类型或嵌套表当成普通字段漏掉关系。
典型翻车现场:用 expdp 导出 DDL 后试图用其他工具导入建模,结果 SYNONYM 和 DBLINK 引用的远程表全丢,ER 图里断链一堆。
- 必须在 Data Modeler 里新建一个
Relational Model,再右键 →Import → Data Dictionary,选 “Live database connection” - 连接时用户名填
SYSTEM或有SELECT_CATALOG_ROLE的账号,普通应用账号查不到完整约束信息 - 导出 PDF 前,进
Tools → Preferences → Export → PDF,把Font size调到 9–10,否则小字号在 PDF 里发虚
跨库统一管理 ER 图?别拼工具链,用 dbdiagram.io 的 API + sqlglot 做中间层转换
当团队同时维护 PG、MySQL、Oracle,又不想每个库装一套 GUI 工具,硬解 DDL 再喂给绘图库是条死路——各库语法差异太大,CREATE TABLE 里一个 GENERATED ALWAYS AS 就能让 parser 报错。更可行的是用 sqlglot 先把不同方言转成统一中间表示(IR),再喂给 dbdiagram.io 的 CLI 工具生成 SVG,最后用 weasyprint 转 PDF。
这个方案的复杂点不在代码,而在字段类型映射:比如 Oracle 的 NUMBER(5,2)、PG 的 NUMERIC(5,2)、MySQL 的 DECIMAL(5,2) 在 IR 里得归一为 decimal(precision=5, scale=2),否则生成的图里类型栏乱码。
-
sqlglot解析时指定dialect="postgres"等参数,再用.transform()统一重写类型节点 -
dbdiagram.io不提供官方 CLI,但它的 Web 接口可 POST JSON(含 tables/relationships 字段),用curl或requests调用即可 - 最终 PDF 的页边距、标题页加注释,得靠
weasyprint的 CSS 控制,别指望svg2pdf这类简单工具保真度
真正难的从来不是导出按钮按下去那一刻,而是外键定义里藏着的 ON DELETE CASCADE 是否被所有工具正确识别、是否在 PDF 图例里标出箭头样式——这些细节一旦漏掉,下游人看图改代码就容易误判依赖方向。


















