数据库是以有组织但灵活的方式存储信息的工具。电子表格本质上是一个数据库,但图形应用程序的约束使得大多数电子表格应用程序对程序员来说毫无用处。随着边缘计算和物联网设备成为重要的目标平台,开发人员需要强大而轻量级的解决方案来存储、处理和查询大量数据。我最喜欢的组合之一是 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 等,因此无论您的工具集如何,您都可能可以使用这个出色的数据库。
2 条评论