PostgreSQL / 简短指南

如何在 PostgreSQL 中导出数据库和表模式

分享到

简介

在关系型数据库中,数据库模式定义了数据库的结构及其组成部分,如表、字段和索引。提取和导出此信息在许多场景中都很有用,包括备份、迁移到新环境、可视化数据结构以及在代码库中管理这些结构。

在本简短指南中,我们将讨论如何使用 pg_dump 命令导出 PostgreSQL 数据库模式。虽然此实用程序可以从 PostgreSQL 导出多种类型的数据,但我们将在本指南中重点介绍提取数据结构本身。

基本用法

从 PostgreSQL 导出数据库模式所需的基本命令如下所示

pg_dump --schema-only DATABASE > schema.sql

根据您的 PostgreSQL 配置,您可能还需要包含以下一些选项

  • --username= / -U:您要用于身份验证的数据库用户名
  • --password / -W:强制 pg_dump 提示输入密码以进行身份验证
  • --host= / -h:PostgreSQL 所在的hostname或 IP 地址
  • --port= / -p:PostgreSQL 正在监听的端口号

负责告知 pg_dump 仅包含数据库结构,而不包含数据本身的选项是 --schema-only

  • --schema-only-s:仅导出对象定义,而不导出数据本身。

此外,第一个非选项参数(此处用单词“DATABASE”表示)指示要导出的确切数据库。

使用此信息,您可以使用名为 sales_reporter 的受限用户导出名为 SALES 的数据库的模式,命令如下所示

pg_dump --username=sales_reporter --password --schema-only SALES > sales_database_schema.sql

修改导出行为

上面讨论的基本用法将输出与相关数据库相关的每个结构。我们可以使用许多其他选项修改此行为,在某些情况下,可以使用相关的 pg_dumpall 命令。

定位多个数据库

pg_dump 命令旨在导出与单个数据库相关的信息。要一次定位多个数据库,您可以改为替换 pg_dumpall 命令,该命令遵循类似的语法。

要转储 PostgreSQL 集群中的所有数据库模式,请输入

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 数据库中的三个表分别名为 EMPLOYEESTOREINVENTORY,并且都在默认的 public 模式中定义,则可以通过键入以下内容仅导出这些结构

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 仅尝试删除数据库中已存在的数据库对象。

例如,如果您想在模式导出中包含创建数据库本身的命令,您可以键入

pg_dump --schema-only --create SALES > sales_db_schema.sql

要在创建 SALES 数据库中的任何数据库对象之前删除它们,您可以改为使用

pg_dump --schema-only --clean --if-exists SALES > sales_db_schema.sql

结论

能够导出您的模式允许您将数据库结构保存在数据库本身之外。这在设置新环境、随着需求变化演变模式以及可视化您正在存储的信息的结构时非常有用。

关于作者
Justin Ellingwood

Justin Ellingwood

自 2013 年以来,Justin 一直在撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。