卷 I · 起底CH 02深度 02/24

把 PostgreSQL 跑起来

读数据库的书,最好手边真有一个库。这一章我们花几分钟把 PostgreSQL 装好、连上,认识它的门面 psql——之后书里每一段 SQL,你都能亲手敲进去,看它当真地回你话。

安装psql元命令CLI 对照

三条路,任选一条

把 PostgreSQL 跑起来有很多种方式,挑最顺手的一条即可。目标只有一个:得到一个能连的库。

路一:本机安装(最适合边读边练)

# macOS(Homebrew)
$ brew install postgresql@17
$ brew services start postgresql@17

# Ubuntu / Debian
$ sudo apt install postgresql
$ sudo systemctl start postgresql

# Windows:官网下载 EDB 安装包,一路下一步,自带 pgAdmin

装好后,Homebrew 会以你的系统用户名建一个同名超级用户和同名数据库,直接就能连。Linux 上则通常有一个 postgres 系统用户,第一次用 sudo -u postgres psql 进去。

路二:Docker(最干净,用完即弃)

$ docker run --name pg -e POSTGRES_PASSWORD=secret \
      -p 5432:5432 -d postgres:17

$ docker exec -it pg psql -U postgres

一行拉起一个全新的 PostgreSQL 17,端口映到本机 5432。练完 docker rm -f pg 一删,干干净净,不在你机器上留任何东西。

路三:一个免费云实例(零安装)

Neon、Supabase、Aiven 等都提供免费的 PostgreSQL 实例,注册完给你一个连接串(postgresql://user:pass@host/db),本地用 psql "连接串" 就能连。适合不想在本机装东西的人。

建一个练手的库

连上之后,先建一个专门用来读这本书的数据库,别在默认库里折腾:

$ createdb serious          # 命令行直接建库(PG 自带的小工具)
$ psql serious              # 连进这个库

psql (17.2)
Type "help" for help.

serious=#                   # 这个 =# 提示符,就是你接下来的战场

那个 serious=# 提示符值得多看一眼。serious 是当前库名,=# 里的 # 表示你是超级用户(普通用户是 =>)。当你的语句还没写完(比如没打分号),提示符会变成 serious-#,提醒你「这句还没完」。

◆ 一个数据库服务里有很多「库」

PostgreSQL 的一个实例(一个跑着的服务进程)里,可以有多个数据库(database);每个数据库里又有多个 schema(命名空间,默认叫 public);schema 里才是表。所以完整的层级是 实例 › 数据库 › schema › 表。这和 MySQL 不同——在 MySQL 里,databaseschema 几乎是同义词,没有中间那一层。这个差别在卷 VI 讲权限和多租户时会变得重要。

psql:不是「简陋的命令行」,是一件趁手的工具

很多从图形工具过来的人小看 psql,觉得它就是个黑框框。其实它是 PostgreSQL 世界里最趁手的工具之一,核心是那套反斜杠元命令(backslash commands)——它们不是 SQL,是 psql 自己的快捷指令,用来查看数据库结构、控制显示。

最常用的一把:

元命令作用MySQL 里的对应
\l列出所有数据库SHOW DATABASES;
\dt列出当前库的所有表SHOW TABLES;
\d 表名看一张表的结构(列、类型、索引、约束)DESCRIBE 表; / SHOW CREATE TABLE
\di列出所有索引SHOW INDEX FROM 表;
\du列出所有角色 / 用户SELECT user FROM mysql.user;
\c 库名切换到另一个数据库USE 库名;
\x切换「竖排」显示(宽表神器)\G(放在语句末尾)
\timing开关每条语句的耗时显示默认就显示
\e用外部编辑器写这条长 SQL
\? / \h元命令帮助 / SQL 语法帮助help

\d 表名 是你会用得最多的一个。它把一张表的全貌一次给你:

serious=# \d orders
                          Table "public.orders"
 Column  |  Type         | Nullable |             Default
---------+---------------+----------+---------------------------------
 id      | integer       | not null | nextval('orders_id_seq'::regclass)
 ship_by | date          |          |
 code    | character varying(4) |   |
 qty     | integer       |          |
Indexes:
    "orders_pkey" PRIMARY KEY, btree (id)

列、类型、能不能为空、默认值、索引、约束,一屏看全——比在 MySQL 里 SHOW CREATE TABLE 读那一大段建表语句清爽得多。

▶ 上手 · 两个立刻能用的小技巧

\x auto:让 psql 自动决定横排还是竖排——窄结果横着显示,宽结果自动转竖排,一列一行,再宽的表也不串行。

把常用设置写进 ~/.psqlrc:比如 \timing on\x auto\set COMP_KEYWORD_CASE upper(关键字自动补全成大写)。每次连库自动生效,一劳永逸。

跑第一句 SQL

确认一切正常,来一句最没营养但最踏实的查询:

SELECT version();
 PostgreSQL 17.2 on aarch64-apple-darwin, compiled by clang ...
(1 row)

看到版本号,说明你已经站在一个真正的 PostgreSQL 面前了。从下一章起,我们建起示例数据,正式开挖。

顺便:怎么把一段 SQL 喂进去

三种方式,都会用到:

  • 交互式:直接在 =# 后面敲,分号结束。适合探索。
  • 跑一个文件psql serious -f schema.sql,或在 psql 里 \i schema.sql。适合建表、导数据。
  • 一次性psql serious -c "SELECT count(*) FROM orders;",跑完就退。适合脚本、CI。
⇄ 对照 MySQL

mysql 客户端过来,几处习惯要改一下:

  • 看结构:不是 DESCRIBE t,是 \d t;不是 SHOW TABLES,是 \dt;不是 SHOW DATABASES,是 \l。这些查看命令在 PG 里全是反斜杠元命令,不是 SQL。
  • 竖排显示:MySQL 用语句末尾的 \G,PG 用 \x 开关(或 \x auto)。
  • 切库:MySQL 的 USE db 在 PG 里是 \c db;而且 PG 里切库是重新连接(跨库查询不能像 MySQL 那样 db.table 直接点过去,卷 VI 会讲原因)。
  • 反引号:MySQL 用反引号 `col` 包标识符,PG 用双引号 "col"——而且 PG 里双引号还会让标识符区分大小写,这是个常见坑(卷 VI 详谈)。字符串两边一律用单引号,这点两家一致。

这一章的一句话

装好一个库、记住 psql\d / \dt / \l 三件套,你就有了一个能随时验证的战场。接下来的每一个概念,都请顺手在真库里敲一遍——「当真」这件事,看别人讲一百遍,不如自己被它拒绝一次记得牢。