分享到

介绍

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

因此,你需要了解如何通过提供必要的身份验证信息作为客户端进行连接。在本指南中,我们将介绍如何使用原生 psql 命令行客户端 连接到 PostgreSQL 数据库——这是一种与数据库实例交互的最常见和最有效的方法。

在配套指南中,你可以了解如何 配置 PostgreSQL 的身份验证以满足项目的需要。为了更全面地了解 PostgreSQL 中的身份验证工作原理,请考虑阅读这两份指南。

如果你的数据库客户端或库请求连接 URI,你可能想要查看我们的指南,了解 PostgreSQL 连接 URI

关于 psql 客户端的基本信息

PostgreSQL 的原生命令行客户端 psql 可以连接到数据库实例,提供交互式会话或向服务器发送命令。它在实现初始设置和进行基本配置时特别有用,然后再通过应用程序库与数据库进行交互。此外,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

按 Enter 键后,系统会提示您输入密码,您可以在其中使用 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

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