免费工具

PostgreSQL 转 ER 图

直接粘贴 pg_dump 的输出,SET 行、ALTER TABLE ONLY 约束和 COPY 块都可以保留,即可得到包含所有表和外键的 ER 图。试试多租户 SaaS 示例,它用到了 IDENTITY 列、enum 类型和分区表。

示例输出

由 PostgreSQL 示例绘制的示例图表
试试示例多租户 SaaS

使用方法

  1. 粘贴或拖入 pg_dump 输出

    纯文本转储、迁移文件,或来自 psql、pgAdmin、ORM 的 CREATE TABLE 语句都可以。无需事先清理转储。

  2. 查看每张表及其键

    pg_dump 写在文件末尾的键会与各自的表对应起来,每条外键连线都从它自己的列出发;包含多个模式的转储会为每个模式画一个框。

  3. 在 Archboard 中打开

    保存为新图表后,可以重新排列、添加注释、分享链接,或导出为 SVG 和 PNG。注册只需 Google 或 GitHub 账号。

从 PostgreSQL 导出数据库结构

对数据库运行以下命令,然后粘贴 schema.sql 或拖入该文件:

  1. --schema-only 不导出数据行,--no-owner 和 --no-privileges 会去掉 OWNER TO、GRANT 和 REVOKE 行。加上 --schema=sales 可只导出一个模式。把 mydb 换成数据库名,需要时加上 -h 和 -U,或改用连接 URI。

    pg_dump --schema-only --no-owner --no-privileges mydb > schema.sql

转储中的 PostgreSQL 语法

pg_dump 文件中各语法结构的处理方式:

serial · GENERATED … AS IDENTITY
读取为普通列,类型保持原样;IDENTITY 或序列默认值不显示。serial 列只有在 PRIMARY KEY 声明时才标为 PK,因为 serial 本身不会创建键。
CREATE TYPE … AS ENUM
enum 类型的名称会成为列类型,例如 order_status;其标签不会列在卡片上。
CREATE SCHEMA
转储中有多个模式时,每个包含表的模式都会成为包住这些表的框,跨模式的外键会穿过框画出。
ALTER TABLE ONLY … ADD CONSTRAINT
会读取。pg_dump 把主键、唯一约束和外键写在文件最后,它们会在所有表都读完后再应用。
PARTITION OF
折叠进父表,按月拆分的表只显示为一张卡片;预览会显示折叠了多少个分区。ATTACH PARTITION 也按同样方式处理。
$$ … $$
美元引号中的函数和存储过程主体会整体跳过,因此其中的分号不会把语句截断。DO 块中的 CREATE TABLE 和 ALTER TABLE … ADD CONSTRAINT 仍会被读取。
COPY … FROM stdin
随后的数据行会一直跳过、不被读取,直到结尾的 \. 行。
\restrict
会被跳过。较新的 pg_dump 版本会在转储前后写入 \restrict 和 \unrestrict 行;这些行以及 \connect 等其他 psql 元命令都会被忽略。

pg_dump 生成的图不包含的内容

  • 表数据。COPY 块和 INSERT 语句中的行不会被读取,所以带数据的转储与用 --schema-only 导出的转储画出的图相同。
  • 函数、存储过程、触发器和 DO 块代码。它们的主体会被跳过并计数;DO 块中只提取表和约束。
  • 行级访问策略(RLS)、GRANT 和 REVOKE,以及对象所有者。谁可以读取或修改某张表不会出现在图上。
  • 运行中的 PostgreSQL 服务器上的任何信息。不会建立连接,因此不显示表大小、行数和已安装的扩展。

PostgreSQL 常见问题

应该使用哪些 pg_dump 选项?

pg_dump --schema-only --no-owner --no-privileges 的输出最短,但任何纯文本转储都可以使用,带数据的也行。用 -Fc 生成的自定义格式归档不是 SQL 文本:请用 pg_restore --schema-only -f schema.sql 加上归档文件名把它转换成 SQL。

多个模式如何显示?

每个包含表的模式都会成为一个框,表放在框内,因此 public、billing 和 audit 会分开显示,它们之间的外键会穿过框画出。只想画一个模式时,可以用 --schema=名称(简写 -n)单独导出它。

分区表会怎样处理?

用 PARTITION OF 创建、或之后用 ATTACH PARTITION 挂上的分区会折叠进父表,因此拆成十二个月度分区的 payments 表只显示为一张卡片。预览会注明折叠了多少个分区。

会显示 enum 和自定义类型吗?

用 CREATE TYPE … AS ENUM 创建的 enum 会作为列类型使用,因此 status 列显示 order_status,但不会列出 enum 的标签。域和复合类型不会画成卡片;使用它们的列仍会按原样显示类型名。

粘贴转储时会保存什么吗?

预览不会被保存。选择“在 Archboard 中打开”后,绘制出的图表,包括表卡片、列名和类型、模式框以及连线,会作为新图表保存到你的工作区中。之后对数据库的修改不会更新它。

PostgreSQL ER 图工具免费吗?

是的。粘贴转储和查看图表无需账号。在 Archboard 中打开图表需要一个免费账号。

一分钟打开画布

使用 Google 或 GitHub 登录。单席位免费,团队加入后再升级。