分享到

简介

使用 PostgreSQL 数据库时,首先需要考虑的是如何连接和与数据库实例交互。这需要数据库客户端(您用于与数据库交互的组件)和数据库服务器(实际存储、组织和提供数据访问的 PostgreSQL 实例)之间的协调。

因此,您需要了解如何通过提供所需的认证信息来作为客户端连接。本指南将介绍如何使用原生的 psql 命令行客户端连接到 PostgreSQL 数据库——这是与数据库实例交互最常见和最有用的方式之一。

在配套指南中,您可以了解如何配置 PostgreSQL 的认证以满足您的项目需求。建议阅读这两份指南,以更全面地了解 PostgreSQL 中认证的工作方式。

如果您的数据库客户端或库请求连接 URI,您可能需要查看我们的理解 PostgreSQL 连接 URI 指南。

psql 客户端的基本信息

psql 客户端是 PostgreSQL 的原生命令行客户端,可以连接到数据库实例以提供交互式会话或向服务器发送命令。它在实现初始设置和进行基本配置时特别有用,尤其是在通过应用程序库与数据库交互之前。此外,psql 非常适合在开发程序将使用的访问模式时进行交互式探索或即席查询。

连接方式取决于 PostgreSQL 服务器的配置以及可用于认证到账户的选项。在以下部分中,我们将介绍一些基本的连接选项。为了清晰起见,我们将区分本地连接和远程连接。

  • 本地连接:客户端和 PostgreSQL 实例位于同一服务器上的连接
  • 远程连接:客户端连接到运行在不同计算机上的网络可访问的 PostgreSQL 实例

让我们从连接到同一台计算机上的数据库开始。

使用 psql 连接到本地数据库

在没有任何参数的情况下,psql 命令会尝试连接到 Unix 套接字文件来访问本地数据库。它使用您的操作系统用户名作为您尝试连接的 PostgreSQL 用户名和数据库名。

默认情况下,现代版本的 PostgreSQL 配置了所谓的对等认证对等认证会在存在与用户操作系统用户名匹配的有效 PostgreSQL 用户时自动认证用户。

因此,如果您的当前用户是本地数据库上的有效 PostgreSQL 用户,您可以通过输入以下命令进行连接:

psql

然而,您的普通操作系统用户名不太可能已经拥有关联的 PostgreSQL 用户名。所以通常,您需要使用已经拥有关联 PostgreSQL 角色的操作系统用户名登录 PostgreSQL。

默认情况下,PostgreSQL 的超级用户或管理员账户称为 postgres。安装时,也会在操作系统上创建一个名为 postgres 的用户。因此,要以 postgres 用户身份登录 PostgreSQL,您需要以 postgres 操作系统用户身份连接。有多种方法可以做到这一点。

在大多数系统上,作为 postgres 用户获取 shell 的最简单方法是使用 sudo 命令。要为 postgres 用户打开一个 shell 会话,然后登录到数据库,您可以输入:

sudo --login --user=postgres
psql

如果您不需要以 postgres 用户身份执行任何额外的 shell 命令,您也可以直接以 postgres 用户身份运行 psql 命令。这会立即将您登录到 PostgreSQL 会话,而不是先带您进入 shell:

sudo --login --user=postgres psql

这两种方法都应该允许您登录到 postgres PostgreSQL 用户账户。

连接到远程数据库

出于安全原因以及对本地套接字文件的依赖,对等认证不能用于远程连接。相反,用户需要使用另一种方法登录。

可用的认证方法根据 PostgreSQL 实例的配置而异。然而,最常见的是,您将能够通过提供以下信息进行认证:

选项描述
主机名PostgreSQL 服务器的网络主机名或 IP 地址。使用 -h 选项指定主机名。
网络端口PostgreSQL 服务器运行的网络端口。默认情况下是端口 5432。如果使用默认值,可以省略此项。要指定不同的端口,可以使用 -p 选项。
PostgreSQL 用户名您希望连接的数据库用户名。如果未指定,将使用您的操作系统用户名。使用 -U 选项可以覆盖默认值并定义要连接的用户名。
PostgreSQL 密码与指定用户名关联的 PostgreSQL 密码。由于如果未提供密码,psql 将会提示您输入密码,因此通常可以省略此项。
PostgreSQL 数据库您要访问的 PostgreSQL 数据库名。如果未指定,您的操作系统用户名将用作数据库名。要指定不同的数据库,请使用 -d 选项。

有多种方式可以将连接信息提供给 psql。这里,我们将介绍两种最常见的方式:通过传递选项和使用连接字符串。

通过选项将连接信息传递给 psql

因此,连接到远程数据库的基本格式通常如下所示:

psql -h <hostname> -p <port> -U <username> -d <database>

远程服务器会指示它需要大多数账户的密码,此时 psql 会提示您输入密码。如果您认证成功,将启动一个新的交互式 PostgreSQL 会话。

例如,我们可以想象要连接到具有以下要求的数据库:

  • 主机名:myhost
  • 端口:1234
  • 数据库:applicationdb
  • 用户名:myapplicationuser
  • 密码:mypass

使用以下选项调用 psql 将允许您进行认证:

psql -h myhost -p 1234 -U myapplicationuser -d applicationdb

按下回车键后,您将被提示输入密码,您可以使用 mypass 进行认证。

通过连接字符串将连接信息传递给 psql

同样的信息也可以编码为 PostgreSQL 连接字符串。连接字符串在一个 URI 字符串中提供相同的信息,该字符串使用某些字符作为不同字段之间的分隔符。

连接字符串具有以下通用格式:

postgresql://<username>:<password>@<hostname>:<port>/<database>

如果不需要或默认值有效,则可以省略每个字段。

我们可以选择使用连接字符串连接 psql,而不是使用我们之前示例中使用的选项:

psql postgresql://myapplicationuser:mypass@myhost:1234/applicationdb

psql 工具可以使用这两种格式中的任何一种,因此请使用您喜欢的一种。您可能遇到的其他工具或库可能会倾向于让您更多地依赖其中一种。

调整 PostgreSQL 服务器的认证配置

如果您想修改控制用户如何认证到 PostgreSQL 实例的规则,可以通过修改服务器的配置来实现。您可以在本文中了解如何修改 PostgreSQL 的认证配置

总结

在本指南中,我们从客户端角度介绍了 PostgreSQL 认证。我们演示了如何使用 psql 命令行客户端通过多种方法连接到本地和远程数据库实例。

在开始使用数据库系统时,了解如何连接各种 PostgreSQL 实例至关重要。您可能运行本地 PostgreSQL 实例进行开发,该实例不需要任何特殊认证,但您的预生产和生产数据库几乎肯定需要认证。能够在两种情况下进行认证将使您能够很好地在不同环境中工作。

作者简介
Justin Ellingwood

贾斯汀·埃林伍德(Justin Ellingwood)

贾斯汀自 2013 年以来一直撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不需要以第三人称写作,这让所有相关方都松了一口气。
© . All rights reserved.