介绍
关系数据库管理系统是许多网站和应用程序的关键组件。 它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL 或 Postgres 是一个关系数据库管理系统,它提供了 SQL 查询语言的实现。 它符合标准并具有许多高级功能,例如可靠事务和无读锁的并发性。
本指南演示了如何在 Ubuntu 20.04 服务器上安装 Postgres。 它还为一般数据库管理提供了一些说明。
先决条件
要学习本教程,您需要一台 Ubuntu 20.04 服务器,该服务器已按照我们的 Initial Server Setup for Ubuntu 20.04 指南进行配置。 完成此先决条件教程后,您的服务器应该有一个具有 sudo 权限和基本防火墙的非 root 用户。
您还可以使用嵌入在此页面上的交互式终端来尝试在本教程中安装和配置 PostgreSQL。 单击下面的Launch an Interactive Terminal!
按钮开始使用。
启动交互式终端!
第 1 步 — 安装 PostgreSQL
Ubuntu 的默认存储库包含 Postgres 包,因此您可以使用 apt
打包系统安装这些包。
如果您最近没有这样做,请刷新服务器的本地包索引:
sudo apt update
然后,安装 Postgres 包和一个 -contrib
包,它添加了一些额外的实用程序和功能:
sudo apt install postgresql postgresql-contrib
使用 systemctl start
命令确保服务器正在运行:
sudo systemctl start postgresql.service
现在该软件已安装并运行,我们可以了解它的工作原理以及它与您可能使用的其他关系数据库管理系统的不同之处。
第 2 步 — 使用 PostgreSQL 角色和数据库
默认情况下,Postgres 使用一个称为“角色”的概念来处理身份验证和授权。 这些在某些方面类似于常规的 Unix 风格的帐户,但 Postgres 不区分用户和组,而是更喜欢更灵活的术语“角色”。
安装后,Postgres 设置为使用 对等身份验证 ,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户相关联。 如果 Postgres 中存在角色,则具有相同名称的 Unix/Linux 用户名可以作为该角色登录。
安装过程创建了一个名为 postgres 的用户帐户,该帐户与默认 Postgres 角色相关联。 为了使用 Postgres,您可以登录该帐户。
有几种方法可以利用此帐户访问 Postgres。
切换到 postgres 帐户
通过键入以下内容切换到服务器上的 postgres 帐户:
sudo -i -u postgres
您现在可以通过键入以下内容立即访问 PostgreSQL 提示:
psql
从那里您可以根据需要自由地与数据库管理系统进行交互。
通过键入以下内容退出 PostgreSQL 提示:
\q
这将带您回到 postgres
Linux 命令提示符。
在不切换帐户的情况下访问 Postgres 提示
您也可以直接使用 sudo
使用 postgres 帐户运行您想要的命令。
例如,在最后一个示例中,系统指示您首先切换到 postgres 用户,然后运行 psql
以打开 Postgres 提示符,从而进入 Postgres 提示符。 您可以通过使用 sudo
以 postgres 用户身份运行单个命令 psql
一步完成,如下所示:
sudo -u postgres psql
这将使您直接登录 Postgres,而无需中间的 bash
shell。
同样,您可以通过键入以下内容退出交互式 Postgres 会话:
\q
许多用例需要多个 Postgres 角色。 继续阅读以了解如何配置这些。
第 3 步 — 创建新角色
目前,您只需在数据库中配置 postgres 角色。 您可以使用 createrole
命令从命令行创建新角色。 --interactive
标志将提示您输入新角色的名称,并询问它是否应该具有超级用户权限。
如果您以 postgres 帐户登录,您可以通过键入以下内容来创建新用户:
createuser --interactive
相反,如果您更喜欢对每个命令使用 sudo
而无需从您的普通帐户切换,请键入:
sudo -u postgres createuser --interactive
该脚本将提示您进行一些选择,并根据您的响应执行正确的 Postgres 命令来创建符合您要求的用户。
OutputEnter name of role to add: sammy Shall the new role be a superuser? (y/n) y
您可以通过传递一些额外的标志来获得更多控制权。 通过查看 man
页面查看选项:
man createuser
您安装的 Postgres 现在有一个新用户,但您还没有添加任何数据库。 下一节将介绍此过程。
第 4 步 — 创建一个新数据库
Postgres 身份验证系统默认做出的另一个假设是,对于任何用于登录的角色,该角色将拥有一个可以访问的同名数据库。
这意味着如果您在上一节中创建的用户名为 sammy,则该角色将尝试连接到默认情况下也称为“sammy”的数据库。 您可以使用 createdb
命令创建适当的数据库。
如果您以 postgres 帐户登录,您将键入如下内容:
createdb sammy
相反,如果您更喜欢对每个命令使用 sudo
而不是从您的普通帐户切换,您可以输入:
sudo -u postgres createdb sammy
这种灵活性为根据需要创建数据库提供了多种途径。
第 5 步 — 使用新角色打开 Postgres 提示
要使用对等身份验证登录,您需要一个与您的 Postgres 角色和数据库同名的 Linux 用户。
如果您没有匹配的 Linux 用户,您可以使用 adduser
命令创建一个。 您必须从具有 sudo
权限的非 root 帐户执行此操作(意思是,未以 postgres 用户身份登录):
sudo adduser sammy
一旦这个新帐户可用,您可以切换并通过键入以下内容连接到数据库:
sudo -i -u sammy psql
或者,您可以内联执行此操作:
sudo -u sammy psql
假设所有组件都已正确配置,此命令将自动让您登录。
如果您希望您的用户连接到不同的数据库,您可以通过像这样指定数据库来实现:
psql -d postgres
登录后,您可以通过键入以下内容来检查您当前的连接信息:
\conninfo
OutputYou 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 中创建和管理表的更多信息。
出于演示目的,创建下表:
CREATE TABLE playground ( equip_id serial PRIMARY KEY, type varchar (50) NOT NULL, color varchar (25) NOT NULL, location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')), install_date date );
此命令将创建一个用于盘点游乐场设备的表。 表中的第一列将保存 serial
类型的设备 ID 号,它是一个自动递增的整数。 此列还具有 PRIMARY KEY
的约束,这意味着其中的值必须是唯一的并且不能为空。
接下来的两行分别为设备 type
和 color
创建列,两者都不能为空。 这些之后的行创建一个 location
列以及一个要求该值是八个可能值之一的约束。 最后一行创建一个 date
列,记录您安装设备的日期。
对于其中两列(equip_id
和 install_date
),该命令未指定字段长度。 原因是某些数据类型不需要设置长度,因为长度或格式是隐含的。
您可以通过键入以下内容查看新表:
\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
的东西,它的类型是 sequence
。 这是您为 equip_id
列提供的 serial
类型的表示。 这会跟踪序列中的下一个数字,并为这种类型的列自动创建。
如果您只想查看没有序列的表格,您可以键入:
\dt
Output List of relations Schema | Name | Type | Owner --------+------------+-------+------- public | playground | table | sammy (1 row)
准备好一张表,让我们用它来练习管理数据。
第 7 步 — 在表中添加、查询和删除数据
现在您有了一个表,您可以在其中插入一些数据。 例如,通过调用要添加到的表格、命名列然后为每列提供数据来添加幻灯片和秋千,如下所示:
INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28'); INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');
输入数据时应注意避免一些常见的挂断。 一方面,不要将列名用引号引起来,但您输入的列值确实需要引号。
要记住的另一件事是,您没有为 equip_id
列输入值。 这是因为每当您向表中添加新行时,它都会自动生成。
通过键入以下内容检索您添加的信息:
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
已成功填写,并且您的所有其他数据都已正确组织。
如果操场上的幻灯片损坏并且您必须将其删除,您还可以通过键入以下内容从表格中删除该行:
DELETE FROM playground WHERE type = 'slide';
再次查询表:
SELECT * FROM playground;
Output equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 2 | swing | yellow | northwest | 2018-08-16 (1 row)
请注意,slide
行不再是表格的一部分。
第 8 步 — 在表中添加和删除列
创建表后,您可以通过添加或删除列来修改它。 通过键入以下内容添加一列以显示每台设备的最后一次维护访问:
ALTER TABLE playground ADD last_maint date;
如果再次查看表信息,您将看到新列已添加但未输入任何数据:
SELECT * FROM playground;
Output equip_id | type | color | location | install_date | last_maint ----------+-------+--------+-----------+--------------+------------ 2 | swing | yellow | northwest | 2018-08-16 | (1 row)
如果您发现您的工作人员使用单独的工具来跟踪维护历史记录,您可以通过键入以下内容删除该列:
ALTER TABLE playground DROP last_maint;
这将删除 last_maint
列和其中找到的任何值,但保留所有其他数据不变。
第 9 步 — 更新表中的数据
到目前为止,您已经学习了如何向表中添加记录以及如何删除它们,但本教程尚未介绍如何修改现有条目。
您可以通过查询所需记录并将列设置为您希望使用的值来更新现有条目的值。 您可以查询 swing
记录(这将匹配表中的 every 摆动)并将其颜色更改为 red
。 如果您给秋千组涂漆,这可能很有用:
UPDATE playground SET color = 'red' WHERE type = 'swing';
您可以通过再次查询数据来验证操作是否成功:
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 及其使用方法的更多信息,我们鼓励您查看以下指南: