简介
在关系数据库中,数据库架构定义了数据库及其组成部分(如表、字段和索引)的结构。提取和导出此信息在许多场景中都很有用,包括备份、迁移到新环境、可视化数据结构以及在代码库中管理这些结构。
在这篇简短的指南中,我们将讨论如何使用 pg_dump 命令导出 PostgreSQL 数据库的 schema。虽然这个实用程序可以从 PostgreSQL 导出许多类型的数据,但本指南中我们将重点关注提取数据结构本身。
您可以使用 Prisma Client 从 JavaScript 或 TypeScript 应用程序中管理 PostgreSQL 数据库。了解如何将 Prisma 添加到现有项目或如何从头开始使用 Prisma。
基本用法
从 PostgreSQL 导出数据库 schema 的基本命令如下所示
pg_dump --schema-only DATABASE > schema.sql
根据您的 PostgreSQL 配置,您可能还需要包含以下一些选项
--username=/-U: 用于认证的数据库用户名--password/-W: 强制pg_dump提示输入密码进行认证--host=/-h: PostgreSQL 所在的主机名或 IP 地址--port=/-p: PostgreSQL 监听的端口号
负责告诉 pg_dump 只包含数据库结构而不包含数据本身的选项是 --schema-only
--schema-only:-s: 仅导出对象定义,不导出数据本身。
此外,第一个非选项参数(此处用单词“DATABASE”表示)指示要导出的具体数据库。
利用这些信息,您可以使用名为 sales_reporter 的受限用户,通过类似以下命令导出名为 SALES 的数据库的 schema
pg_dump --username=sales_reporter --password --schema-only SALES > sales_database_schema.sql
修改导出行为
上面讨论的基本用法将输出与目标数据库相关的所有结构。我们可以通过一些额外的选项来修改此行为,在某些情况下,也可以使用相关的 pg_dumpall 命令。
针对多个数据库
pg_dump 命令旨在导出与单个数据库相关的信息。要一次针对多个数据库,您可以改为使用 pg_dumpall 命令,其语法类似。
要转储 PostgreSQL 集群中的所有数据库 schema,请键入
pg_dumpall --schema-only > all_schemas.sql
如果您想限制要转储的数据库,可以选择包含 --exclude-database= 选项。这可以多次使用以针对单个数据库
pg_dumpall --schema-only --exclude-database=FIRST --exclude-database=SECOND > almost_all_schemas.sql
它还可以使用通配符匹配来捕获具有单个模式的多个数据库
pg_dumpall --schema-only --exclude-database='SALES_*' > all_schemas_except_sales.sql
仅导出特定结构
您还可以通过命名要导出的特定表来减少导出的结构
--table=/-t: 仅转储与给定模式匹配的表。可多次提供。--exclude-table=/-T: 排除与给定模式匹配的表。可多次提供。
例如,如果您的 SALES 数据库中有三个表名为 EMPLOYEE、STORE 和 INVENTORY,并且它们都定义在默认的 public schema 中,您可以通过输入以下命令仅导出这些结构
pg_dump --schema-only --table='public."EMPLOYEE"' --table='public."STORE"' --table='public."INVENTORY"' SALES > some_sales_tables.sql
注意: 您可以在我们关于如何在 PostgreSQL 中使用单引号和双引号的指南中了解更多关于 PostgreSQL 如何解释不同类型引号的信息。
如果您想要所有销售数据,但排除这三个表,您将改为使用
pg_dump --schema-only --exclude-table='public."EMPLOYEE"' --exclude-table='public."STORE"' --exclude-table='public."INVENTORY"' SALES > some_sales_tables.sql
其他相关选项
根据您的目标,一些其他有用的选项包括
--create/-C: 在转储其所包含的结构之前,包含创建数据库本身的命令。--clean/-c: 输出在创建数据库对象之前删除它们的命令。--if-exists: 仅与--clean一起使用时相关,将导致pg_dump仅尝试删除数据库中已存在的数据库对象。
例如,如果您想在 schema 导出中包含创建数据库本身的命令,您可以键入
pg_dump --schema-only --create SALES > sales_db_schema.sql
要在创建 SALES 数据库中的任何数据库对象之前删除它们,您可以改为使用
pg_dump --schema-only --clean --if-exists SALES > sales_db_schema.sql
结论
能够导出架构使您能够将数据库结构保存到数据库本身之外。这在设置新环境、根据需求演进架构以及可视化所存储信息的结构时很有帮助。
您可以使用 Prisma Client 从 JavaScript 或 TypeScript 应用程序中管理 PostgreSQL 数据库。了解如何将 Prisma 添加到现有项目或如何从头开始使用 Prisma。
