安装与 psql
这一课你将能做到
- 用官方 Docker 镜像在本机跑起 PostgreSQL,且不碰本站 MySQL 3306
- 用 psql 连接、切换库、列出表,并执行
SELECT version();
- 把常用 meta 命令(
\l \c \dt \d)和 MySQL 客户端习惯一一对应上
为什么要学
PG 的交互入口是 psql(或任意兼容的 GUI)。不会连库,后面的 DDL、JSONB、事务课全是纸上谈兵。官方推荐开发者熟悉 psql:它能跑 SQL,也能用反斜杠命令探元数据,排错时比纯 GUI 更快。
本课用 Docker 降低安装摩擦:无需卸载 MySQL 8,无需改本站 application.yml。数据先放容器内即可;持久化卷放到 pg-docker。
先建立图像
你的终端
│ docker run … postgres:16-alpine
▼
容器 pg-dev :5432
│ POSTGRES_USER / PASSWORD / DB
▼
数据库 codeforge_pg
│ docker exec -it … psql
▼
psql 提示符 codeforge_pg=#
│ SQL 或 \dt \d …
▼
结果打印在终端
| 概念 | 人话 | 本课取值 |
|---|
| 实例 | 正在跑的 PG 服务 | Docker 容器 pg-dev |
| 数据库 | 实例里的一个库 | codeforge_pg |
| 角色(用户) | 登录身份 | codeforge |
| schema | 库内的命名空间 | 默认 public,稍后建 practice |
| psql | 官方命令行客户端 | 容器内或本机安装 |
MySQL 的 USE db ≈ psql 的 \c db;SHOW TABLES ≈ \dt。
跟着做
步骤 1:确认 Docker 可用
docker version
应看到 Client / Server 信息。若只有 Client 无 Server,先启动 Docker Desktop(或等价引擎)。
步骤 2:启动官方镜像
docker run -d --name pg-dev \
-e POSTGRES_USER=codeforge \
-e POSTGRES_PASSWORD=devpass \
-e POSTGRES_DB=codeforge_pg \
-p 5432:5432 \
postgres:16-alpine
说明:
POSTGRES_* 环境变量由官方镜像在首次初始化时创建用户与库(见镜像说明)
-p 5432:5432 把容器端口映到本机;若本机已有其它 PG,可改成 -p 5433:5432
- 未挂卷时,
docker rm -v 会丢数据——练习阶段可接受
检查:
docker ps --filter name=pg-dev
步骤 3:进入 psql
docker exec -it pg-dev psql -U codeforge -d codeforge_pg
-- 确认版本与当前会话身份
SELECT version();
SELECT current_database(), current_user;
SELECT 1 AS ok;
应看到 PostgreSQL 16.x 一行版本串,以及 codeforge_pg / codeforge。
psql "postgresql://codeforge:devpass@127.0.0.1:5432/codeforge_pg"
步骤 4:练一手 meta 命令
\l:列出数据库
\dt:当前 search_path 下的表(新库应为空)
\dn:列出 schema
\q 退出。再 docker exec … psql … 进一次,确认 schema 仍在。
步骤 5:对照 MySQL 习惯做一张小表
| 你想做的事 | MySQL 近似 | psql / PG |
|---|
| 列库 | SHOW DATABASES | \l |
| 切库 | USE db | \c dbname |
| 列表 | SHOW TABLES | \dt |
| 看表结构 | DESCRIBE t | \d t |
| 退出 | exit | \q |
步骤 6:确认与 MySQL 并存
# MySQL 仍应在 3306(本站主线)
# PG 在 5432
不要用本课容器当生产;密码 devpass 仅本地。
讲清楚要点
- 因为 官方镜像在首次启动时读取
POSTGRES_USER / POSTGRES_DB,所以 改环境变量后若数据目录已初始化,不会自动重建用户——练习库直接删容器重建最省事。
- psql 默认自动提交:单条 SQL 立即生效;要事务需显式
BEGIN(事务课再练)。
- 连接串
postgresql://用户:密码@主机:端口/库 是应用与 GUI 的通用写法,Spring 里变成 jdbc:postgresql://…。
- schema ≠ 数据库:PG 里一个数据库下可有多个 schema(
public、practice、app);MySQL 常把「库」当命名空间。本 track 后面用 app schema 模拟业务。
- 权限模型是角色:登录角色需要对库、schema、表有相应权限;开发镜像默认超级用户式角色够用,生产要收紧。
- 端口冲突时改映射:本机 5432 被占用就映射
5433:5432,连接串端口跟着改。
你可能会懵的地方
-
psql: error: connection refused?
容器未就绪或端口映错。docker logs pg-dev 看是否 ready to accept connections;等几秒再连。
-
密码对但认证失败?
查用户名、库名是否与 POSTGRES_* 一致;URL 里特殊字符需编码。
-
\dt 空但我记得建过表?
表可能在别的 schema,或连错了库。用 \dt *.* 或 \dn + \dt practice.*。
-
要不要本机安装 PostgreSQL 服务?
入门不必。Docker 足够;GUI(DBeaver 等)可连同一端口。
-
和 mysql 命令哪个更「正宗」?
对 PG 而言 psql 是官方客户端;GUI 是可选壳。本 track 步骤以 psql 为准。
错法对照
| 错法 | 问题 | 正解 |
|---|
把 -p 3306:5432 映到 MySQL 端口 | 与本站库冲突或连错引擎 | 用 5432:5432 或空闲端口 |
在未 docker exec 的本机直接敲 psql(未安装) | command not found | 用容器内 psql 或先装客户端 |
| 密码写进截图发群 | 泄露(即便是 dev) | 本地笔记即可;生产用密钥管理 |
以为 \d 是 SQL | 语法错误 | 反斜杠命令只在 psql 里有效 |
| 删容器却指望数据还在(未挂卷) | 练习数据丢失 | 接受重建,或按 docker 课挂卷 |
自测三问
POSTGRES_DB=codeforge_pg 与之后 psql -d codeforge_pg 分别解决什么问题?
\c 和 MySQL 的 USE 有何对应?\dt 对应什么?
- 为何本课强调「不要改生产 MySQL 配置来学 PG」?
小结一句话
Docker 官方镜像 + psql 是本地学 PostgreSQL 的最低成本路径;先连上、会探元数据,再谈 DDL。
官方延伸