如何在Ubuntu 20.04上安装和使用PostgreSQL

介绍

关系型数据库管理系统是许多网站和应用程序的关键组成部分。它们提供了一种结构化的方式来存储、组织和访问信息。

PostgreSQL,或称为Postgres,是一种关系型数据库管理系统,提供了SQL查询语言的实现。它符合标准,并具有可靠的事务和并发性,无需读取锁定。

本指南演示了如何在Ubuntu 20.04服务器上安装Postgres。它还提供了一些常规数据库管理的说明。

使用DigitalOcean托管数据库一键部署PostgreSQL数据库。让DigitalOcean专注于为您的数据库进行扩展、维护和升级。

先决条件

要按照本教程进行操作,您需要一台已按照我们的Ubuntu 20.04初始服务器设置指南进行配置的服务器。完成这个先决教程后,您的服务器应该有一个具有sudo权限的非root用户和一个基本的防火墙。

步骤1 — 安装PostgreSQL

Ubuntu的默认软件源包含Postgres软件包,因此您可以使用apt包管理系统来安装这些软件包。

如果您最近没有这样做,请刷新服务器的本地软件包索引:

  1. sudo apt update

然后,安装Postgres软件包以及一个-contrib软件包,它添加了一些额外的实用工具和功能:

  1. sudo apt install postgresql postgresql-contrib

确保服务器正在运行,使用systemctl start命令:

  1. sudo systemctl start postgresql.service

现在软件已安装并运行,我们可以讨论它的工作原理以及与您可能使用过的其他关系型数据库管理系统有何不同。

步骤2 — 使用PostgreSQL角色和数据库

默认情况下,Postgres 使用一个叫做 “角色” 的概念来处理身份验证和授权。在某些方面,这些与常规的 Unix 风格账户类似,但 Postgres 不区分用户和组,而是更倾向于使用更灵活的术语 “角色”。

在安装时,Postgres 被设置为使用 对等认证,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统账户关联起来。如果一个角色在 Postgres 中存在,具有相同名称的 Unix/Linux 用户名可以以该角色身份登录。

安装过程创建了一个名为 postgres 的用户账户,该账户与默认的 Postgres 角色关联。要使用 Postgres,您可以登录该账户。

有几种方法可以利用这个账户来访问 Postgres。

切换到 postgres 账户

通过键入以下命令切换到您服务器上的 postgres 账户:

  1. sudo -i -u postgres

现在您可以立即键入以下命令访问 PostgreSQL 提示符:

  1. psql

从那里,您可以自由地与数据库管理系统进行交互。

通过键入以下命令退出 PostgreSQL 提示符:

  1. \q

这将把您带回 postgres Linux 命令提示符。

不切换帐户即可访问Postgres提示符

您还可以使用sudo直接以postgres帐户运行您想要的命令。

例如,在上一个示例中,您被指示通过首先切换到postgres用户,然后运行psql来打开Postgres提示符。您可以通过以sudo身份运行单个命令psql作为postgres用户来一次完成此操作,就像这样:

  1. sudo -u postgres psql

这将直接登录到Postgres,而不需要中间的bash shell。

同样,您可以通过输入以下内容退出交互式Postgres会话:

  1. \q

许多用例需要多个Postgres角色。继续阅读以了解如何配置这些角色。

第三步 — 创建新角色

目前,在数据库中只配置了postgres角色。您可以使用createrole命令从命令行创建新角色。--interactive标志将提示您输入新角色的名称,并询问是否应该具有超级用户权限。

如果您以postgres账户登录,可以通过键入以下内容创建新用户:

  1. createuser --interactive

如果您希望在不切换到普通帐户的情况下为每个命令使用sudo,请键入:

  1. sudo -u postgres createuser --interactive

脚本将提示您进行一些选择,并根据您的响应执行正确的Postgres命令以创建符合您规格要求的用户。

Output
Enter name of role to add: sammy Shall the new role be a superuser? (y/n) y

您可以通过传递一些额外的标志来获得更多控制。查看man页面以查看选项:

  1. man createuser

您的Postgres安装现在有了一个新用户,但是您还没有添加任何数据库。下一节描述了这个过程。

步骤 4 —— 创建新数据库

Postgres身份验证系统默认的另一个假设是,用于登录的任何角色都将具有与其名称相同的数据库,可以访问该数据库。

这意味着,如果您在上一节中创建的用户叫做sammy,该角色将尝试连接到默认情况下也称为“sammy”的数据库。您可以使用createdb命令创建适当的数据库。

如果您以postgres账户登录,您会输入类似于:

  1. createdb sammy

如果您更喜欢在不切换到您的普通账户的情况下为每个命令使用sudo,您可以输入:

  1. sudo -u postgres createdb sammy

这种灵活性提供了根据需要创建数据库的多种途径。

第5步 —— 使用新角色打开Postgres提示符

要使用对等验证登录,您需要一个Linux用户,其名称与您的Postgres角色和数据库相同。

如果没有匹配的Linux用户可用,您可以使用adduser命令创建一个。您必须从具有sudo权限的非root账户(即非postgres用户登录)执行此操作:

  1. sudo adduser sammy

一旦这个新账户可用,您可以切换并连接到数据库,输入:

  1. sudo -i -u sammy
  2. psql

或者,您可以直接执行此操作:

  1. sudo -u sammy psql

假设所有组件都已正确配置,此命令将自动登录您。

如果您想让用户连接到不同的数据库,可以通过以下方式指定数据库:

  1. psql -d postgres

登录后,您可以通过输入以下内容来查看当前连接信息:

  1. \conninfo
Output
You are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".

如果连接到非默认数据库或使用非默认用户,则这将非常有用。

第6步 —— 创建和删除表

现在您已经了解如何连接到PostgreSQL数据库系统,可以学习一些基本的Postgres管理任务。

创建表的基本语法如下:

CREATE TABLE table_name (
    column_name1 col_type (field_length) column_constraints,
    column_name2 col_type (field_length),
    column_name3 col_type (field_length)
);

如您所见,这些命令为表命名,然后定义列以及列的类型和字段数据的最大长度。您还可以选择为每列添加表约束。

您可以在此处了解更多关于如何在Postgres中创建和管理表的信息。

为了演示目的,请创建以下表:

  1. CREATE TABLE playground (
  2. equip_id serial PRIMARY KEY,
  3. type varchar (50) NOT NULL,
  4. color varchar (25) NOT NULL,
  5. location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
  6. install_date date
  7. );

此命令将创建一个库存游乐场设备的表。表中的第一列将保存serial类型的设备ID号,这是一个自增的整数。此列还具有PRIMARY KEY约束,这意味着其中的值必须是唯一且不为空。

下面的两行分别创建了设备类型颜色的列,两者都不能为空。在这些之后的行创建了一个位置列,并添加了一个约束,要求值必须是八个可能值之一。最后一行创建了一个日期列,记录了安装设备的日期。

对于两个列(equip_idinstall_date),命令没有指定字段长度。这是因为某些数据类型不需要设置长度,因为长度或格式是隐含的。

您可以通过键入以下内容来查看新表:

  1. \d
Output
List of relations Schema | Name | Type | Owner --------+-------------------------+----------+------- public | playground | table | sammy public | playground_equip_id_seq | sequence | sammy (2 rows)

您的游乐场表在这里,但还有一个名为playground_equip_id_seq的东西,它的类型是序列。这是你给equip_id列指定的serial类型的表示。它会自动跟踪序列中的下一个数字,并为此类型的列自动创建。

如果您只想查看表而不包括序列,您可以输入:

  1. \dt
Output
List of relations Schema | Name | Type | Owner --------+------------+-------+------- public | playground | table | sammy (1 row)

准备好表格后,让我们使用它来练习数据管理。

第7步 — 在表中添加、查询和删除数据

现在您有了一个表,可以向其中插入一些数据。例如,通过调用要添加到的表,命名列,然后为每列提供数据,添加一个滑梯和一个秋千,就像这样:

  1. INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
  2. INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

在输入数据时要小心,以避免一些常见的问题。首先,不要将列名用引号括起来,但输入的列值确实需要用引号括起来。

另一个要记住的事情是,不要为equip_id列输入值。这是因为每当向表中添加新行时,此值都会自动生成。

通过键入检索您添加的信息:

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 1 | slide | blue | south | 2017-04-28 2 | swing | yellow | northwest | 2018-08-16 (2 rows)

在这里,您可以看到您的equip_id已成功填充,所有其他数据也已正确组织。

如果操场上的滑梯坏了,您必须将其移除,还可以通过键入从表中删除该行:

  1. DELETE FROM playground WHERE type = 'slide';

再次查询表:

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 2 | swing | yellow | northwest | 2018-08-16 (1 row)

注意,slide行不再是表的一部分。

步骤8 —— 向表中添加和删除列

创建表后,可以通过添加或删除列来修改它。添加一列以显示每件设备的最后维护访问时间,输入:

  1. ALTER TABLE playground ADD last_maint date;

如果您再次查看表格信息,您会发现已经添加了新列,但尚未输入数据:

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date | last_maint ----------+-------+--------+-----------+--------------+------------ 2 | swing | yellow | northwest | 2018-08-16 | (1 row)

如果您发现您的工作人员使用单独的工具来跟踪维护历史记录,您可以通过键入:

  1. ALTER TABLE playground DROP last_maint;

删除该列:last_maint以及其中找到的任何值,但保留所有其他数据。

第 9 步 —— 更新表中的数据

到目前为止,您已经学会了如何向表中添加记录以及如何删除它们,但是本教程尚未涵盖如何修改现有条目。

您可以通过查询要更新的记录并将列设置为要使用的值来更新现有条目的值。您可以查询 swing 记录(这将匹配您表中的每个 秋千),并将其颜色更改为 red。如果您对秋千进行了油漆工作,这可能会很有用:

  1. UPDATE playground SET color = 'red' WHERE type = 'swing';

您可以通过再次查询数据来验证操作是否成功:

  1. SELECT * FROM playground;
Output
equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2018-08-16 (1 row)

如您所见,滑梯现在被注册为红色。

结论

您现在已在您的Ubuntu 20.04服务器上设置了PostgreSQL。如果您想了解更多关于Postgres及其如何使用的信息,我们鼓励您查阅以下指南:

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-20-04