如何在Ubuntu18.04上安装和使用PostgreSQL
介绍
关系数据库管理系统是许多网站和应用程序的关键组件。 它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL 或 Postgres 是一个关系数据库管理系统,提供 SQL 查询语言的实现。 它是许多小型和大型项目的流行选择,具有符合标准的优势,并具有许多高级功能,例如可靠事务和无读锁的并发性。
本指南演示了如何在 Ubuntu 18.04 VPS 实例上安装 Postgres,还提供了基本数据库管理的说明。
先决条件
要学习本教程,您需要一台 Ubuntu 18.04 服务器,该服务器已按照我们的 Ubuntu 18.04 初始服务器设置指南进行配置。 完成此先决条件教程后,您的服务器应该有一个具有 sudo 权限和基本防火墙的非 root 用户。
您还可以使用嵌入在此页面上的交互式终端来尝试在本教程中安装和配置 PostgreSQL。 单击下面的Launch an Interactive Terminal!
按钮开始使用。
启动交互式终端!
第 1 步 — 安装 PostgreSQL
Ubuntu 的默认存储库包含 Postgres 包,因此您可以使用 apt
打包系统安装这些包。
由于这是您第一次在此会话中使用 apt
,请刷新您的本地包索引。 然后,安装 Postgres 包和一个 -contrib
包,它添加了一些额外的实用程序和功能:
sudo apt update sudo apt install postgresql postgresql-contrib
使用 systemctl start
命令确保服务器正在运行:
sudo systemctl start postgresql.service
现在该软件已安装并运行,我们可以了解它的工作原理以及它与您可能使用过的类似数据库管理系统的不同之处。
第 2 步 — 使用 PostgreSQL 角色和数据库
默认情况下,Postgres 使用称为 roles 的概念来处理身份验证和授权。 这些在某些方面类似于常规的 Unix 风格的帐户,但 Postgres 不区分用户和组,而是更喜欢更灵活的术语“角色”。
安装后,Postgres 设置为使用 ident 身份验证,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户相关联。 如果 Postgres 中存在角色,则具有相同名称的 Unix/Linux 用户名可以作为该角色登录。
安装过程创建了一个名为 postgres 的用户帐户,该帐户与默认 Postgres 角色相关联。 为了使用 Postgres,您可以登录该帐户。
有几种方法可以使用此帐户访问 Postgres。
切换到 postgres 帐户
通过键入以下内容切换到服务器上的 postgres 帐户:
sudo -i -u postgres
您现在可以通过键入以下内容立即访问 Postgres 提示:
psql
这将使您登录到 PostgreSQL 提示符,从这里您可以立即自由地与数据库管理系统进行交互。
通过键入以下内容退出 PostgreSQL 提示:
\q
这将带您回到 postgres
Linux 命令提示符。
在不切换帐户的情况下访问 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 命令以创建符合您的规范的用户。
首先,提示将要求您为新角色指定一个名称。 以下示例将角色命名为 sammy,但您可以随意命名:
OutputEnter name of role to add: sammy
接下来,系统会询问您新角色是否应该是超级用户。 在 PostgreSQL 中,超级用户角色拥有极其广泛的权限,他们可以绕过几乎所有的权限检查。
以下示例指定 sammy 角色应该是超级用户,但是,因为超级用户角色对数据库有很大的权力和控制权,所以您不应轻易授予新角色超级用户身份:
OutputEnter name of role to add: sammy Shall the new role be a superuser? (y/n) y
请注意,如果您将它们创建为已经是超级用户的角色,则只能创建新的超级用户角色。 默认情况下,postgres 角色是超级用户。
您可以通过传递一些额外的标志来获得更多控制权。 通过查看 man
页面查看选项:
man createuser
您安装的 Postgres 现在有了一个新角色,但您还没有添加任何数据库。 下一节将介绍此过程。
第 4 步 — 创建一个新数据库
Postgres 身份验证系统默认做出的另一个假设是,对于任何用于登录的角色,该角色将拥有一个可以访问的同名数据库。
这意味着,如果您在上一节中创建的用户名为 sammy,则该角色将尝试连接到默认情况下也称为“sammy”的数据库。 您可以使用 createdb
命令创建适当的数据库。
如果您以 postgres 帐户登录,您将键入如下内容:
createdb sammy
相反,如果您更喜欢对每个命令使用 sudo
而不是从您的普通帐户切换,您可以输入:
sudo -u postgres createdb sammy
这种灵活性为根据需要创建数据库提供了多种途径。
第 5 步 — 使用新角色打开 Postgres 提示
要使用基于 ident
的身份验证登录,您需要一个与您的 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 );
这些命令将创建一个盘点游乐场设备的表。 这从设备 ID 开始,它是 serial
类型。 此数据类型是一个自动递增的整数。 您还为该列提供了 primary key
的约束,这意味着值必须是唯一的并且不能为空。
对于其中的两列(equip_id
和 install_date
),命令不指定字段长度。 这是因为某些列类型不需要设置长度,因为类型隐含了长度。
接下来的两个命令分别为设备 type
和 color
创建列,每个都不能为空(由应用于每个的 NOT NULL
约束指定)。 这些之后的行创建一个 location
列并添加一个约束,要求该列的值是八个可能值之一。 括号中的最后一行创建一个 date
列,记录您安装设备的日期。
请注意,在 SQL 中,每条语句都必须以分号 (;
) 结尾。
如果您正确输入了 CREATE TABLE
操作,它将返回以下输出:
OutputCREATE TABLE
您可以通过键入以下内容来查找此数据库中的表列表:
\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)
请注意,您的幻灯片不再是表格的一部分。
第 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)
要删除一列,您可以输入一条与添加 last_maint
列非常相似的 SQL 语句。 如果您发现您的工作人员使用单独的工具来跟踪维护历史记录,您可以通过键入以下内容删除该列:
ALTER TABLE playground DROP last_maint;
这将删除 last_maint
列和其中找到的任何值,但保留所有其他数据不变。
第 9 步 — 更新表中的数据
到目前为止,您已经学习了如何向表中添加记录以及如何删除它们,但本教程尚未介绍如何修改现有条目。
您可以通过查询所需记录并将列设置为您希望使用的值来更新现有条目的值。 您可以查询“swing”记录(这将匹配表中的 every swing)并将其颜色更改为“red”。 如果您给秋千组涂漆,这可能很有用:
UPDATE playground SET color = 'red' WHERE type = 'swing';
您可以通过再次查询数据来验证操作是否成功:
SELECT * FROM playground;
Output equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2010-08-16 (1 row)
正如此输出所示,您的幻灯片现在已注册为红色。
结论
您现在已在 Ubuntu 18.04 服务器上设置了 PostgreSQL。 但是,使用 Postgres 仍有 很多 需要学习。 这里有一些更多的指南,涵盖了如何使用 Postgres: