删除 PostgreSQL 的数据库

Postgres 是最灵活的数据库之一,而且是开源的。
2 位读者喜欢这篇文章。
Business woman on laptop sitting in front of window

图片来源:Mapbox Uncharted ERG, CC-BY 3.0 US

数据库是以有组织但灵活的方式存储信息的工具。电子表格本质上是一个数据库,但图形应用程序的约束使得大多数电子表格应用程序对程序员来说毫无用处。随着边缘计算和物联网设备成为重要的目标平台,开发人员需要强大而轻量级的解决方案来存储、处理和查询大量数据。我最喜欢的组合之一是 PostgreSQL 数据库和 Lua 绑定,但可能性是无限的。无论您使用哪种语言,Postgres 都是数据库的绝佳选择,但在采用它之前,您需要了解一些基础知识。

安装 Postgres

要在 Linux 上安装 PostgreSQL,请使用您的软件仓库。在 Fedora、CentOS、Mageia 和类似系统上

$ sudo dnf install postgresql postgresql-server

在 Debian、Linux Mint、Elementary 和类似系统上

$ sudo apt install postgresql postgresql-contrib

在 macOS 和 Windows 上,从 postgresql.org 下载安装程序。

设置 Postgres

大多数发行版在安装 Postgres 数据库时不会启动它,但会为您提供一个脚本或 systemd 服务,以帮助它可靠地启动。但是,在启动 PostgreSQL 之前,您必须创建一个数据库集群。

Fedora

在 Fedora、CentOS 或类似系统上,Postgres 软件包中提供了一个 Postgres 设置脚本。运行此脚本以进行简易配置

$ sudo /usr/bin/postgresql-setup --initdb
[sudo] password:
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Debian

在基于 Debian 的发行版上,安装期间 apt 会自动执行设置。

其他所有系统

最后,如果您运行的是其他系统,那么您可以直接使用 Postgres 本身提供的工具链。initdb 命令创建一个数据库集群,但您必须以 postgres 用户身份运行它,您可以使用 sudo 临时获得此身份

$ sudo -u postgres \
"initdb -D /var/lib/pgsql/data \
--locale en_US.UTF-8 --auth md5 --pwprompt"

启动 Postgres

现在集群已存在,使用 initdb 输出中提供给您的命令或使用 systemd 启动 Postgres 服务器

$ sudo systemctl start postgresql

创建数据库用户

要创建 Postgres 用户,请使用 createuser 命令。postgres 用户是 Postgres 安装的超级用户,

$ sudo -u postgres createuser --interactive --password bogus
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:

创建数据库

要创建新数据库,请使用 createdb 命令。在此示例中,我创建了数据库 exampledb 并将其所有权分配给用户 bogus

$ createdb exampledb --owner bogus

与 PostgreSQL 交互

您可以使用 psql 命令与 PostgreSQL 数据库进行交互。此命令提供一个交互式 shell,以便您可以查看和更新您的数据库。要连接到数据库,请指定您要使用的用户和数据库

$ psql --user bogus exampledb
psql (XX.Y)
Type "help" for help.

exampledb=>

创建表

数据库包含表,可以将表可视化为电子表格。它有一系列行(在数据库中称为记录)和列。行和列的交叉点称为字段

结构化查询语言 (SQL) 以其提供的功能命名:一种以可预测且一致的语法查询数据库内容以接收有用结果的方法。

目前,您的数据库是空的,没有任何表。您可以使用 CREATE 查询创建表。将其与 IF NOT EXISTS 语句结合使用很有用,这可以防止 PostgreSQL 覆盖现有表。

在创建表之前,请考虑您希望表包含哪种数据(SQL 术语中的“数据类型”)。在此示例中,我创建一个表,其中一列用于唯一标识符,另一列用于最多九个字符的任意文本。

exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);

SERIAL 关键字实际上不是数据类型。它是 PostgreSQL 中的特殊表示法,用于创建自动递增的整数字段。VARCHAR 关键字是一种数据类型,表示限制范围内的可变字符数。在此代码中,我指定了最多 9 个字符。PostgreSQL 中有很多数据类型,因此请参阅项目文档以获取选项列表。

插入数据

您可以使用 INSERT SQL 关键字使用一些示例数据填充您的新表

exampledb=> INSERT INTO my_sample_table (wordlist) VALUES ('Alice');
INSERT 0 1

如果您尝试在 wordlist 字段中放入超过 9 个字符,您的数据输入将失败

exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES ('Alexandria');
ERROR:  value too long for type character varying(9)

更改表或列

当您需要更改字段定义时,请使用 ALTER SQL 关键字。例如,如果您认为 wordlist 的九个字符限制不够,您可以通过设置其数据类型来增加其允许的字符数

exampledb=> ALTER TABLE my_sample_table
ALTER COLUMN wordlist SET DATA TYPE VARCHAR(10);
ALTER TABLE
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES ('Alexandria');
INSERT 0 1

查看表中的数据

SQL 是一种查询语言,因此您通过查询查看数据库的内容。查询可以很简单,也可以涉及连接几个不同表之间的复杂关系。要查看表中的所有内容,请在 * 上使用 SELECT 关键字(星号是通配符)

exampledb=> SELECT * FROM my_sample_table;
 id |  wordlist
\----+------------
  1 | Alice
  2 | Bob
  3 | Alexandria
(3 rows)

更多数据

PostgreSQL 可以处理大量数据,但与任何数据库一样,成功的关键在于您如何设计数据库以进行存储以及在存储数据后如何处理数据。可以在 OECD.org 上找到相对较大的公共数据集,使用它可以尝试一些高级数据库技术。

首先,以逗号分隔值 (CSV) 格式下载数据,并将文件另存为 land-cover.csv 到您的 Downloads 文件夹中。

在文本编辑器或电子表格应用程序中浏览数据,以了解有哪些列以及每列包含哪种数据。仔细查看数据,并留意明显规则的例外情况。例如,COU 列包含国家/地区代码,例如澳大利亚的 AUS 和希腊的 GRC,通常为 3 个字符,直到出现异常的 BRIICS

一旦您了解了正在处理的数据,您就可以准备一个 Postgres 数据库

$ createdb landcoverdb --owner bogus
$ psql --user bogus landcoverdb
landcoverdb=> create table land_cover(
country_code varchar(6),
country_name varchar(76),
small_subnational_region_code varchar(5),
small_subnational_region_name varchar(14),
large_subnational_region_code varchar(17),
large_subnational_region_name varchar(44),
measure_code varchar(13),
measure_name varchar(29),
land_cover_class_code varchar(17),
land_cover_class_name varchar(19),
year_code integer,
year_value integer,
unit_code varchar(3),
unit_name varchar(17),
power_code integer,
power_name varchar(9),
reference_period_code varchar(1),
reference_period_name varchar(1),
value float(8),
flag_codes varchar(1),
flag_names varchar(1));

导入数据

Postgres 可以使用特殊的元命令 \copy 直接导入 CSV 数据

landcoverdb=> \copy land_cover from '~/land-cover.csv' with csv header delimiter ','
COPY 22113

已导入 22,113 条记录。看起来是个不错的开始!

查询数据

可以使用广泛的 SELECT 语句来查看所有 22,113 条记录的所有列,并且 Postgres 非常好地将输出通过管道传输到屏幕分页器,以便您可以悠闲地滚动浏览输出。但是,使用高级 SQL,您可以获得一些有用的视图,了解其他一些相当原始的数据。

landcoverdb=> select
    lcm.country_name,
    lcm.year_value,
    sum(lcm.value) sum_value
from land_cover lcm
join (
    select
        country_name,
        large_subnational_region_name,
        small_subnational_region_name,
        max(year_value) max_year_value
    from land_cover
    group by country_name,
        large_subnational_region_name,
        small_subnational_region_name
) as lcmyv
on
    lcm.country_name = lcmyv.country_name and
    lcm.large_subnational_region_name = lcmyv.large_subnational_region_name and
    lcm.small_subnational_region_name = lcmyv.small_subnational_region_name and
    lcm.year_value = lcmyv.max_year_value
group by lcm.country_name,
    lcm.large_subnational_region_name,
    lcm.small_subnational_region_name,
    lcm.year_value
order by country_name,
    year_value;

以下是一些示例输出

\---------------+------------+------------
 Afghanistan    |       2019 |  743.48425
 Albania        |       2019 |  128.82532
 Algeria        |       2019 |  2417.3281
 American Samoa |       2019 |   100.2007
 Andorra        |       2019 |  100.45613
 Angola         |       2019 |  1354.2192
 Anguilla       |       2019 | 100.078514
 Antarctica     |       2019 |  12561.907
[...]

SQL 是一种丰富的语言,因此它超出了本文的范围。通读 SQL 代码,看看是否可以修改它以提供不同的数据集。

打开数据库

PostgreSQL 是优秀的开源数据库之一。有了它,您可以为结构化数据设计存储库,然后使用 SQL 以不同的方式查看它,以便您可以获得对该数据的新鲜视角。Postgres 与许多语言集成,包括 Python、Lua、Groovy、Java 等,因此无论您的工具集如何,您都可能可以使用这个出色的数据库。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 爱好者、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。
Chris Hermansen portrait Temuco Chile
自从 1978 年毕业于不列颠哥伦比亚大学以来,我很少离开计算机。自 2005 年以来,我一直是全职 Linux 用户,1986 年至 2005 年是全职 Solaris 和 SunOS 用户,在此之前是 UNIX System V 用户。

2 条评论

在您执行之后
sudo systemctl start postgresql.service
您可以执行
sudo systemctl enable postgresql.service
以便 postgresql 服务器在您每次启动计算机时启动。
顺便说一句,我的系统需要在 postgresql 之后添加 .service。

我已经使用 postgreSQL 好几年了。
我切换到它是因为它有自己的 IPv4 和 IPv6 地址数据类型,例如inetcidr。所以我可以查询表中给定网络中的 IP。哦,别忘了macaddr.
我个人的“梦之队”是 postgreSQL 与 Flask 或 Django。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.