PostgreSQL 是最灵活的数据库之一,并且它是开源的。
数据库是以一种有组织且灵活的方式存储信息的工具。电子表格在本质上就是一个数据库,但是图形化应用程序这一限制使得大多数的电子表格应用程序对程序员毫无用处。随着 边缘计算和物联网设备成为重要的平台,开发者们需要更有效且轻量级的方法,来存储、处理、查询大量的数据。我最爱的一种组合是使用Lua 连接 
ostgreSQL 数据库。无论你使用什么编程语言,PostgreSQL 一定是数据库的绝佳选择,但是在使用 PostgreSQL 之前,首先你需要知道一些基本的东西。
在 Linux 上安装 PostgreSQL,要使用你的软件库。在 Fedora,CentOS,Megeia 等类似的 Linux 版本上使用命令:
$ sudo dnf install postgresql postgresql-server
在 Debian, Linux Mint, Elementary 等类似的 Linux 版本上使用命令:
$ sudo apt install postgresql postgresql-contrib
在 macOs 和 Windows 上,可以从官网 postgresql.org下载安装包。
大多数发行版安装 PostgreSQL 数据库时没有启动它,但是为你提供了一个脚本或 systemd 服务,能够可靠地启动 PostgreSQL。但是,在启动 PostgreSQL 之前,必须创建一个数据库集群。
在 Fedora,CentOS 等类似的版本上,PostgreSQL 安装包中提供了一个 PostgreSQL 配置脚本。运行这个脚本,可以进行简单地配置:
$ 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 的发行版上,在安装 Postgres 的过程中,配置会通过 apt
自动完成。
最后,如果你是在其他版本上运行的,那么你可以直接使用 PostgreSQL 提供的一些工具。initdb
命令会创建一个数据库集群,但是这个命令必须在postgres
用户下运行,你可以使用sudo
来暂时地成为postgres
用户:
$ sudo -u postgres \ "initdb -D /var/lib/pgsql/data \ --locale en_US.UTF-8 --auth md5 --pwprompt"
现在,数据库集群已经存在了,使用 initdb
的输出中提供给你的命令或者使用 systemd 启动 PostgreSQL 服务器:
$ sudo systemctl start postgresql
使用 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
你可以使用 psql
命令来与 PostgreSQL 中的数据库进行交互。这个命令提供了一个交互界面,所以你可以用它来查看和更新你的数据库。你需要指定要使用的用户和数据库,来连接到一个数据库。
$ psql --user bogus exampledb
psql (XX.Y)
Type "help" for help.
exampledb=>
数据库包含很多表。这些表可以可视化为表格,有很多行(在数据库中称为 记录)和很多列。行和列的交集称为字段。
结构化查询语言(SQL)是以它提供的内容而命名的,它能提供可预测且一致的语法,来查询数据库内容,从而收到有用的结果。
目前,你的数据库是空的,没有任何的表。你可以用 CREATE
语句来创建一个表。结合使用IF NOT EXISTS
是很有用的,它可以避免破坏现有的表。
在你创建一个表之前,想想看你希望这个表包含哪一种数据(在 SQL 术语中称为“数据类型”)。在这个例子中,我创建了一个表,包含两列,有唯一标识符的一列和最多九个字符的可变长的一列。
exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);
关键字 SERIAL
并不是一个数据类型。SERIAL
是PostgreSQL 中的一个特殊的标记,它可以创建一个自动递增的整数字段。关键字VARCHAR
是一个数据类型,表示限制内字符数的可变字符。在此例中,我指定了最多 9 个字符。PostgreSQL 中有很多数据类型,因此请参阅项目文档以获取选项列表。
你可以使用 INSERT
语句来给你的新表插入一些样本数据:
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
域中最多只能有 9 个字符的限制,你可以重新设置这个数据类型。
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)的文件,并将文件另存为 Downloads
文件夹中的land-cover.csv
。
在文本编辑器或电子表格应用程序中浏览数据,来了解有哪些列,以及每列包含哪些类型的数据。仔细查看数据,并留意错误情况。例如,COU
列指的是国家代码,例如AUS
表示澳大利亚和GRC
表示希腊,在奇怪的BRIICS
之前,这一列的值通常是 3 个字符。
在你理解了这些数据项后,你就可以准备一个 PostgreSQL 数据库了。
$ 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
插入了 22113 条记录。这是一个很好的开始!
用 SELECT
语句可以查询这 22113 条记录的所有列,此外 PostgreSQL 将输出通过管道传输到屏幕上,因此你可以轻松地滚动鼠标来查看输出的结果。更进一步,你可以使用高级 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 以不同的方式查询它,以便能够获得有关该数据的新视角。PostgreSQL 也能与许多语言集成,包括 Python、Lua、Groovy、Java 等,因此无论你使用什么工具集,你都可以充分利用好这个出色的数据库。
USBclean for Mac是一款纯绿色的辅助杀毒工具,USBCleaner具有侦测1000余种U 盘病毒,U 盘病毒广谱扫描,U 盘病毒免疫,修复显示隐藏文件及系统文件,安全卸载移动盘盘符等功能,一体化修复杀除 U 盘病毒。同时USBCleaner 能迅速对新出现的U 盘病毒进行处理。...
微信在我们生活中扮演的社交角色是不可替代的,我们在上班、生活等各地都已经离不开他了,电脑端和手机端的互动已是广泛应用于生活中和工作学习生活中。比如互传文件、图片等等这样即方便又节省很多步骤,省时省力。 但是我们很多人在生活中都不止一个微信号,大家都知道电脑端微信只能登录一个微信...
对于很多考生和家长来说,选择专业一直是一个比较困难的事情,很多家长在报考志愿的时候,都会问专家,孩子学这个专业有没有前途。其实这是一个很笼统的问题,它包含了专业发展前景、对口行业的 对于很多考生和家长来说,选择专业一直是一个比较困难的事情,很多家长在报考志愿的时候,都会问专家,孩子学这个专业有没有...
羊了个羊游戏的玩法规则是什么?玩家在玩这款游戏的时候,刚开始很多人都不知道这款游戏怎么玩,由于不清楚游戏的规则,所以很多玩家在初期都会走很多弯路,今天游戏鸟小编给大家带来游戏的规则 羊了个羊游戏的玩法规则是什么?玩家在玩这款游戏的时候,刚开始很多人都不知道这款游戏怎么玩,由于不清楚游戏的规则,所以...
随着搜索引擎系统的不断优化和完善,在当前互联网用户数量和使用频率不断增加的情况下,站点也越来越多的情况下,seo优化如何做好网站排名,让用户更能注意到我们呢?接下来小编就跟大家分 随着搜索引擎系统的不断优化和完善,在当前互联网用户数量和使用频率不断增加的情况下,站点也越来越多的情况下,seo优化...
转眼一个月又过去了,2022年已经过去一半。按照惯例,今天芝麻科技讯更新一下手机CPU天梯图。本月芯片厂商发布的新处理器不多,所以文章相对简单一些,手机CPU天梯图2022年6月最新版来了,快来看看都有哪些新变 转眼一个月又过去了,2022 年已经过去一半。按照惯例,今天芝麻科技讯更新一下手机CP...
买奥迪A8的人基本都是老板级别的了,因为奥迪A8本身就不便宜,今年推出新款,也有很多营销出来。不过奥迪A8是属于比较低调的车型,同等价位的都会去买奔驰或者宝马了。买奥迪A8都是什么人奥迪A8的知名度不亚于奔驰S级,车子正 买奥迪A8的人基本都是老板级别的了,因为奥迪A8本身就不便宜,今年推出新款,...
寒衣节是很多北方地区都有的风俗习惯,但由于该节日并不是按照阳历来讲的而是按照阴历,所以农历十月初一是阳历的哪一天成了很多人都好奇的,下面小编就和大家一起看看十月初一节日什么意义。农历十月初一是阳历的哪一天农历十月初一是1 寒衣节是很多北方地区都有的风俗习惯,但由于该节日并不是按照阳历来讲的而是按照...
祭祀祖先是逢年过节大家必做的事情之一,这不眼见着十月初一了,也就是我们常说的寒衣节,所以很多友友都在准备送寒衣的事情,下面小编就和大家一起看看2022年十月初一烧纸要摆供吗。2022年十月初一烧纸要摆供吗看地方的讲究。十 祭祀祖先是逢年过节大家必做的事情之一,这不眼见着十月初一了,也就是我们常说的...
寒露节气是在每年十月初,这个时候的天气会比较凉爽舒适,有些地区可能会有点冷,这个主要看各个地区的天气情况,大多数情况下,寒露过了之后,天气就会开始慢慢变冷,大多数地区都不会有高温天气了,有些地区还会有冷空气。2022寒露 寒露节气是在每年十月初,这个时候的天气会比较凉爽舒适,有些地区可能会有点冷,...
冬至烧纸钱是很多地区都有的习俗之一,但由于这是祭祀祖先,所以烧纸的时辰也成了大家茶余饭后讨论的焦点,下面小编就和大家一起看看2022冬至烧纸钱可以提前烧吗宜什么时间点烧。2022冬至烧纸钱可以提前烧吗看地方的讲究,毕竟十 冬至烧纸钱是很多地区都有的习俗之一,但由于这是祭祀祖先,所以烧纸的时辰也成了...
嘴唇疱疹是病毒性感染,和自身免疫力低有关,是具有传染性的,当你将嘴唇疱疹戳破后,很容易感染到新的地方,其他人碰到也会被传染。那么,嘴唇疱疹能彻底治愈吗?一起来看看久久派带来的相信介绍吧!嘴唇疱疹会传染给别人吗唇疱疹会传染 嘴唇疱疹是病毒性感染,和自身免疫力低有关,是具有传染性的,当你将嘴唇疱疹戳破...
很多网友表示iPhonexsmax原相机拍照模式可以吊打所以系列,很多人把xsmax留着也只是为了拍照。目前,轻颜相机更新了xsmax原相机模式,大家可以直接在里面寻找并进行拍照哦!轻颜相机xsmax原相机模式在哪1、当 很多网友表示iPhonexsmax原相机拍照模式可以吊打所以系列,很多人把x...
压岁钱是2023年除夕给还是大年初一给是大家常聊的,对于小孩子来讲一年中最为喜爱的节日除了寒暑假就是春节了,毕竟过年长辈给的压岁钱可以说是一笔不小的收入了,下面小编就和大家一同看看什么是压岁钱。压岁钱是2023年除夕给还 压岁钱是2023年除夕给还是大年初一给是大家常聊的,对于小孩子来讲一年中最为...
iPhone14双11肯定是有优惠的,毕竟在首发苹果14后,并没有什么抢购,因为苹果14和13差距不大,意义上没什么升级。那么,iPhone14双11买会便宜多少?iPhone14双十一有优惠吗?一起来看看久久派带来的详 iPhone14双11肯定是有优惠的,毕竟在首发苹果14后,并没有什么抢购,...