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

介绍

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

PostgreSQL或Postgres是一个关系数据库管理系统,它提供SQL查询语言的实现。它是许多小型和大型项目的流行选择,并且具有符合标准并具有许多高级功能(如可靠事务和并发性而无需读锁定)的优点。

本指南演示了如何在Ubuntu 18.04 服务器上安装Postgres,并提供了基本数据库管理的说明,也可以直接使用云数据库,腾讯云提供云数据库 PostgreSQL(TencentDB for PostgreSQL)能够让您在云端轻松设置、操作和扩展目前功能最强大的开源数据库 PostgreSQL。

准备

一台Ubuntu 18.04 的服务器,并且已设置好一个可以使用sudo命令的非root账户。

安装PostgreSQL

Ubuntu的默认存储库包含Postgres软件包,因此您可以使用apt安装这些软件包。

安装之前先用apt更新一下本地软件包,然后,安装Postgres包和一个附加实用程序和功能的- managed包:

$ sudo apt update
$ sudo apt install postgresql postgresql-contrib

现在已经安装了该软件,我们可以了解它的工作原理以及它与您可能使用的类似数据库管理系统的不同之处。

使用PostgreSQL roles和数据库

默认情况下,Postgres使用称为“roles”的概念来处理身份验证和授权。在某些方面,这些类似于常规的Unix风格帐户,但Postgres不区分用户和组,而是更喜欢更灵活的术语“roles”。

安装后,Postgres设置为使用ident身份验证,这意味着它将Postgresroles与匹配的Unix / Linux系统帐户相关联。如果Postgres中存在roles,则具有相同名称的Unix / Linux用户名可以作为该roles登录。

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

有几种方法可以使用此帐户访问Postgres。

切换到postgres帐户

输入以下内容切换到服务器上的postgres帐户:

$ sudo -i -u postgres

您现在可以通过输入以下内容立即访问Postgres提示:

$ psql

这将使您进入PostgreSQL提示符,从此处您可以立即与数据库管理系统进行交互。

输入以下命令退出PostgreSQL提示符:

postgres=# \q

这将带您回到postgresLinux命令提示符。

在不切换帐户的情况下访问Postgres

您也可以让postgres帐户用sudo运行您想要的命令。

例如,在最后一个示例中,您被指示通过首先切换到postgres用户然后运行psql以打开Postgres提示来进入Postgres提示。您可以通过psqlpostgres用户身份运行单个命令来一步完成此操作sudo,如下所示:

$ sudo -u postgres psql

这将直接登录到Postgres,中间没有中间bashshell。

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

postgres=# \q

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

创建新roles

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

如果您以postgres帐户登录,则可以通过输入以下内容来创建新用户:

postgres@server:~$	createuser --interactive

相反,如果您想不切换帐户,就想用其他账户使用命令,则您应该输入:

$ sudo -u postgres createuser --interactive

该脚本将提示您一些选择,并根据您的响应执行正确的Postgres命令,以根据您的规范创建用户。

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

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

$ man createuser

您现在安装的Postgres有一个新用户,但您还没有添加任何数据库。下一节将介绍此过程。

创建新数据库

Postgres身份验证系统默认使用的另一个假设是,对于用于登录的任何roles,这个roles将具有可以访问的同名数据库。

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

如果您以postgres帐户登录,则可以输入以下内容:

postgres@server:~$ createdb sammy

相反,如果您想不切换帐户,就想用其他账户使用命令,则您应该输入:

$ sudo -u postgres createdb sammy

这种灵活性为创建数据库提供了多种途径

使用新roles打开Postgres提示符

要使用ident基于身份验证的登录,您需要一个与Postgresroles和数据库同名的Linux用户。

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

$ sudo adduser sammy

一旦这个新帐户可用,您可以通过输入以下内容切换并连接到数据库:

$ sudo -i -u sammy
$ psql

或者,您可以内联执行此操作:

$ sudo -u sammy psql

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

如果您希望用户连接到其他数据库,可以通过指定数据库来执行此操作:

$ psql -d postgres

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

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

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

创建和删除表

现在您已了解如何连接到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)
);

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

出于演示目的,创建一个这样的简单表:

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值必须唯一且不为null。

对于其中两列(equip_idinstall_date),命令不指定字段长度。这是因为某些列类型不需要设置长度,因为类型隐含了长度。

接下来的两个命令的设备分别创建typecolor,其中每一个可以不为空。之后的命令会创建一个location列并创建一个约束,该约束要求该值为八个可能值之一。最后一个命令创建一个日期列,记录您安装设备的日期。

您可以输入以下内容来查看新表:

sammy=# \d
                  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。这是serial您为equip_id列提供的类型的表示。这将跟踪序列中的下一个数字,并自动为此类型的列创建。

如果您只想查看没有序列的表,可以输入:

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

添加,查询和删除表中的数据

现在您有了一个表,您可以在其中插入一些数据。

例如,通过调用要添加的表来添加slide和swing,命名列,然后为每列提供数据,如下所示:

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

输入数据时应该小心,以避免一些常见的问题。例如,不要将列名包装在引号中,但是您输入的列值确实需要引号。

另外要记住的是,您不要为equip_id列输入值。这是因为只要创建表中的新行,就会自动生成此项。

通过输入以下内容检索您添加的信息:

sammy=#	SELECT * FROM playground;
 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已成功填写并且所有其他数据已正确组织。

如果playground上的slide断开而您必须将其删除,您还可以通过输入以下内容从表中删除该行:

sammy=#	DELETE FROM playground WHERE type = 'slide';

再次查询表格:

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

您注意到slide不再是表格的一部分。

添加和删除表中的列

创建表后,您可以修改它以相对容易地添加或删除列。输入以下内容,添加一列以显示每件设备的上次维护访问:

sammy=# ALTER TABLE playground ADD last_maint date;

如果再次查看表信息,您将看到添加了新列(但未输入任何数据):

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

删除列也很简单。如果您发现您的工作人员使用单独的工具来跟踪维护历史记录,您可以通过输入以下内容来删除该列:

sammy=#	ALTER TABLE playground DROP last_maint;

这将删除last_maint列及其中的值,但保留所有其他数据。

更新表中的数据

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

您可以通过查询所需的记录并将列设置为您要使用的值来更新现有条目的值。您可以查询“swing”记录(这将匹配表中的每个 swing)并将其颜色更改为“red”。如果你给swing组设置了一个paint作业,这可能很有用:

sammy=#	UPDATE playground SET color = 'red' WHERE type = 'swing';

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

sammy=#	SELECT * FROM playground;
 equip_id | type  | color | location  | install_date 
----------+-------+-------+-----------+--------------
        2 | swing | red   | northwest | 2010-08-16
(1 row)

如您所见,您的slide现在已注册为红色。

结论

您现在在Ubuntu 18.04服务器上设置了PostgreSQL。但是,Postgres 还有很多东西需要学习,可以访问腾讯云官网查看PostgreSQL的用户手册PostgreSQLAPI文档


参考文献:《How To Install and Use PostgreSQL on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醉生梦死

MySQL日志管理工具 mysqlbinlog

 [root@db02 data]# mysqlbinlog mysql_bin.000001

4312
来自专栏无题

分布式锁通用解决方案

分布式锁的解决方式: 基于数据库: 基于数据库表做乐观锁,用于分布式锁。(version) 基于数据库表做悲观锁(InnoDB,for upda...

1.4K6
来自专栏张善友的专栏

AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的缓存管理和使用ObjectBuil

       这两天 PetShop is Evil?等对PetShop 的讨论很多,我在这里也发一篇凑凑热闹。我下面主要是对Asp.net 2.0新增的缓存管...

2018
来自专栏破晓之歌

Django框架中Mysql数据库连接 原

将settings.py文件中的Databases数据库连接部分设置如上,这里的USER和PASSWORD要和mysql里设置的一样,3306端口为默认,127...

992
来自专栏日常分享

Oracle常用数据库系统表单以及SQL的整理

  因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类...

1261
来自专栏喵了个咪的博客空间

基于PhalApi2的Redis拓展

基于PhalApi2的Redis拓展 ? 前言 Redis在PHP开发中运用场景已经无处不在,小到简单缓存大到数据库或消息队列都可以使用Redis来进行实现,基...

3045
来自专栏PHP在线

MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销...

3747
来自专栏程序员的SOD蜜

(PDF.NET框架实例讲解)将存储过程映射为实体类

PDF.NET数据开发框架可以将表,视图,表值函数,自定义的查询语句和存储过程映射为实体类,在上一篇《(PDF.NET框架实例讲解)将任意复杂的SQL查询映射成...

23310
来自专栏jouypub

MySQL使用on duplicate key update时导致主键不连续自增

在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,比如

6665
来自专栏数据和云

经典故障分析 -用好UTL_FILE包其实并不是太容易

作者介绍 ? 崔华 网名 dbsnake Oracle ACE Director,ACOUG 核心专家 UTL_FILE包可以用来读写操作系统上的文本文件...

3359

扫码关注云+社区