如何在 Ubuntu 16.04 上安装和使用 PostgreSQL
介绍
关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL 或 Postgres 是一种关系数据库管理系统,它提供 SQL 查询语言的实现。它是许多小型和大型项目的流行选择,具有符合标准的优势,并具有许多高级功能,如可靠的事务和没有读锁的并发。
在本指南中,我们将演示如何在 Ubuntu 16.04 VPS 实例上安装 Postgres,并介绍一些基本的使用方法。
安装
Ubuntu 的默认存储库包含 Postgres 包,因此我们可以使用 apt
打包系统轻松安装这些包。
由于这是我们第一次在此会话中使用 apt
,因此我们需要刷新本地包索引。然后我们可以安装 Postgres 包和一个添加了一些额外实用程序和功能的 -contrib
包:
- sudo apt-get update
- sudo apt-get install postgresql postgresql-contrib
现在我们的软件已经安装好了,我们可以回顾一下它是如何工作的,以及它与您可能使用过的类似数据库管理系统有何不同。
使用 PostgreSQL 角色和数据库
默认情况下,Postgres 使用称为“角色”的概念来处理身份验证和授权。这些在某些方面类似于常规的 Unix 样式帐户,但 Postgres 不区分用户和组,而是更喜欢更灵活的术语\“角色”。
安装后,Postgres 设置为使用身份验证,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户相关联。如果 Postgres 中存在角色,则具有相同名称的 Unix/Linux 用户名将能够作为该角色登录。
有几种方法可以利用此帐户访问 Postgres。
切换到 postgres 帐户
安装过程创建了一个名为 postgres
的用户帐户,该帐户与默认的 Postgres 角色相关联。为了使用 Postgres,我们可以登录该帐户。
通过键入以下内容切换到服务器上的 postgres
帐户:
- sudo -i -u postgres
您现在可以通过键入以下内容立即访问 Postgres 提示符:
- psql
您将登录并能够立即与数据库管理系统进行交互。
通过键入以下内容退出 PostgreSQL 提示符:
- \q
您现在应该回到 postgres
Linux 命令提示符。
在不切换帐户的情况下访问 Postgres 提示符
您还可以直接使用 sudo
使用 postgres
帐户运行您想要的命令。
例如,在上一个示例中,我们只想进入 Postgres 提示符。我们可以通过以 postgres
用户身份使用 sudo
运行单个命令 psql
来一步完成此操作,如下所示:
- sudo -u postgres psql
这将使您直接登录到 Postgres,而无需中间的 bash
shell。
同样,您可以通过键入以下命令退出交互式 Postgres 会话:
- \q
创建新角色
目前,我们只在数据库中配置了 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 身份验证系统做出的另一个假设是,将有一个与用于登录的角色同名的数据库,角色可以访问该数据库。
因此,如果在上一节中,我们创建了一个名为 sammy
的用户,该角色将尝试连接到一个也称为 sammy
的数据库默认。您可以使用 createdb
命令创建适当的数据库。
如果您以 postgres
帐户登录,您可以键入如下内容:
- createdb sammy
相反,如果您更喜欢对每个命令使用 sudo
而无需从您的普通帐户切换,您可以键入:
- sudo -u postgres createdb sammy
使用新角色打开 Postgres 提示符
要使用基于 ident
的身份验证登录,您需要一个与您的 Postgres 角色和数据库同名的 Linux 用户。
如果您没有可用的匹配 Linux 用户,您可以使用 adduser
命令创建一个。您必须从具有 sudo
权限的帐户(不是以 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".
如果您连接到非默认数据库或非默认用户,这将很有用。
创建和删除表
既然您知道如何连接到 PostgreSQL 数据库系统,我们就可以了解如何完成一些基本任务。
首先,我们可以创建一个表来存储一些数据。让我们创建一个描述游乐场设备的表格。
这个命令的基本语法是这样的:
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
提供列,每列都不能为空。我们创建一个 location
列并创建一个约束,要求该值是八个可能值之一。最后一栏是日期栏,记录了我们安装设备的日期。
我们可以通过键入以下内容来查看我们的新表:
- \d
Output List of relations
Schema | Name | Type | Owner
--------+-------------------------+----------+-------
public | playground | table | sammy
public | playground_equip_id_seq | sequence | sammy
(2 rows)
我们的 playground 表在这里,但我们还有一个名为 playground_equip_id_seq
的东西,它属于 sequence
类型。这是我们为 equip_id
列提供的 serial
类型的表示。这会跟踪序列中的下一个数字,并为此类列自动创建。
如果您只想查看没有序列的表格,您可以键入:
- \dt
Output List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
public | playground | table | sammy
(1 row)
在表中添加、查询和删除数据
现在我们有了一个表,我们可以向其中插入一些数据。
让我们添加一个幻灯片和一个秋千。为此,我们调用要添加的表,为列命名,然后为每一列提供数据。我们的幻灯片和秋千可以这样添加:
- INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2014-04-28');
- INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2010-08-16');
输入数据时应该小心,以避免一些常见的挂断。首先,请记住列名不应被引号括起来,但您输入的列值 确实需要引号。
另一件要记住的事情是我们没有为 equip_id
列输入值。这是因为每当在表中创建新行时,它都会自动生成。
然后我们可以通过键入以下内容取回我们添加的信息:
- SELECT * FROM playground;
Output equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
1 | slide | blue | south | 2014-04-28
2 | swing | yellow | northwest | 2010-08-16
(2 rows)
在这里,您可以看到我们的 equip_id
已成功填写,并且我们所有其他数据已正确组织。
如果 playground 上的幻灯片坏了,我们必须将其删除,我们也可以通过键入以下命令从表中删除该行:
- DELETE FROM playground WHERE type = 'slide';
如果我们再次查询我们的表,我们将看到我们的幻灯片不再是表的一部分:
- SELECT * FROM playground;
Output equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
2 | swing | yellow | northwest | 2010-08-16
(1 row)
如何在表中添加和删除列
如果我们想在创建表后修改它以添加额外的列,我们可以很容易地做到这一点。
我们可以添加一列来显示每台设备的最后一次维护访问,方法是键入:
- ALTER TABLE playground ADD last_maint date;
如果您再次查看您的表信息,您将看到已添加新列(但未输入任何数据):
- SELECT * FROM playground;
Output equip_id | type | color | location | install_date | last_maint
----------+-------+--------+-----------+--------------+------------
2 | swing | yellow | northwest | 2010-08-16 |
(1 row)
我们可以同样轻松地删除一列。如果我们发现我们的工作人员使用单独的工具来跟踪维护历史记录,我们可以通过键入以下内容来删除此处的列:
- ALTER TABLE playground DROP last_maint;
如何更新表中的数据
我们知道如何向表中添加记录以及如何删除它们,但我们还没有介绍如何修改现有条目。
您可以通过查询所需的记录并将列设置为您希望使用的值来更新现有条目的值。我们可以查询 \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 16.04 服务器上设置了 PostgreSQL。然而,还有 很多 Postgres 需要学习。以下是一些涵盖如何使用 Postgres 的指南:
- 关系数据库管理系统的比较
- 了解如何使用 Postgres 创建和管理表
- 更好地管理角色和权限
- 使用带有 Select 的 Postgres 进行工艺查询
- 了解如何保护 PostgreSQL
- 了解如何备份 Postgres 数据库