前言
谁懂啊家人们!刚开始接触 PostgreSQL(简称 PG),我以为是“高冷难搞的数据库大佬”——毕竟听说是企业级首选,还总被拿来和 MySQL 比“高级感”,吓得我连安装都犹豫了3天。
结果上手才发现:这货就是“外冷内热”的全能选手!没有复杂到劝退的配置,核心操作和 SQL 标准几乎无缝衔接,尤其是搭配 Drizzle ORM 做 TS/JS 全栈开发,简直香到起飞🚀
这篇文章不搞“复制粘贴式教学”,全程用「生活化比喻+新手视角」,从安装、登录到 CRUD、进阶技巧,再到和 Drizzle 的无缝衔接,把 PG 讲得明明白白,小白也能跟着一步步撸库,踩过的坑全帮你们避开了!
适合人群:前端转全栈、刚接触数据库的新手、想从 MySQL 切换到 PG 的开发者(尤其适配 TS/JS+Drizzle 场景)
一、先搞懂:PostgreSQL 到底是个啥?(生动比喻版)
很多新手一听到“PostgreSQL”就犯怵,觉得是“高深莫测的企业级工具”,其实用一句话就能讲懂:
PG 就是一款“功能拉满、性格温顺”的开源关系型数据库,和 MySQL 是“同门师兄弟”,但各有侧重:
- MySQL 像「邻家大哥」:随和接地气,入门快,适合小项目、快速落地;
- PG 像「全能优等生」:功底扎实(支持复杂 SQL、事务、外键),特长突出(原生支持 JSON、地理空间类型),性格温顺(几乎兼容所有 SQL 标准),适合中大型项目、全栈开发,尤其和 TS/JS 生态适配拉满。
再举个更直白的例子:把数据库比作「办公室的文件柜」——
-
数据库(PG):就是整个文件柜,负责统一管理所有文件;
-
数据表(Table):就是文件柜里的一个个文件夹(比如“用户文件夹”“帖子文件夹”);
-
字段(Field):就是文件夹上的标签(比如“姓名”“邮箱”“帖子标题”);
-
SQL 命令:就是你“找文件、放文件、改文件”的指令(比如“把张三的资料放进用户文件夹”“把李四的年龄改成26”)。
这么一想,PG 是不是瞬间变得亲切了?其实我们要学的,就是“怎么用指令操控这个文件柜”~
二、第一步:安装 PG(Windows 新手版,避坑重点!)
新手安装 PG,最容易踩两个坑:① 忘记设置的密码 ② Stack Builder 乱勾一堆应用,导致安装失败/冗余。
全程跟着我来,5分钟搞定,零冗余、不踩坑!
2.1 下载安装包(官方正版,安全无套路)
-
打开 PG 官方下载页:www.postgresql.org/download/wi…(不用翻墙,直接进);
-
点击「Download the installer」,下载对应 Windows 系统的安装包(推荐版本 16,主流稳定版,适配 Drizzle 和最新 TS 生态);
-
双击安装包,开始安装,全程默认下一步,但这3个地方一定要注意(重点标红!):
- 密码设置:弹出“Password”窗口时,设置一个容易记住的密码(比如 123456,仅本地开发用,不用怕简单),记在小本本上,后续登录要用,忘记了巨麻烦!
- 端口设置:默认端口 5432,不用改!不用改!不用改!改了后续连接会报错,新手千万别瞎折腾;
- 勾选组件:默认会勾选“PostgreSQL Server”(核心服务)和“pgAdmin 4”(图形化工具),直接勾选,其他不用加,下一步即可。
- 安装完成后,会提示“Launch Stack Builder”,直接取消勾选!别点!别点!别点!
(解释一下:Stack Builder 是附加应用安装工具,新手用不到,乱勾会下载一堆冗余插件,还可能出现版本兼容问题,后续需要再装也不迟,听我的,先取消!)
2.2 验证安装(确保没白装)
安装完成后,打开 Windows 「开始菜单」,能找到两个关键程序,就说明安装成功了:
- PostgreSQL 16 → pgAdmin 4(图形化管理工具,新手首选);
- PostgreSQL 16 → SQL Shell (psql)(命令行工具,后续进阶用)。
到这一步,PG 就已经成功“入驻”你的电脑了,接下来就是“登录”,操控这个“文件柜”~
三、第二步:登录 PG(两种方式,新手先学图形化,再学命令行)
登录 PG 就像“打开文件柜的钥匙”,有两种钥匙:一种是“可视化钥匙”(pgAdmin 4),一种是“命令行钥匙”(psql),新手优先学可视化,简单直观,命令行后续慢慢练。
3.1 方式1:pgAdmin 4(图形化,新手封神级操作)
pgAdmin 4 是 PG 官方自带的“可视化管家”,不用记任何命令,点点鼠标就能建库、建表、执行 SQL,全程可视化,谁用谁夸!
步骤如下,全程截图级讲解:
-
打开 pgAdmin 4:从开始菜单找到它,双击启动,首次启动会提示设置「pgAdmin 主密码」(这个密码是保护 pgAdmin 自身的,不是 PG 数据库的密码,随便设一个容易记的,比如 123456);
-
注册服务器(仅第一次操作):左侧「Browser」面板,右键点击「Servers」→ 「Register」→ 「Server...」(弹出注册窗口);
-
填写登录信息(关键两步,别填错!):
-
General 标签:只填「Name」,自定义一个名字,比如「Local PG 16」,方便识别,随便填;
-
Connection 标签(核心!):
- Host name/address:填 localhost(本地数据库,固定值);
- Port:填 5432(默认端口,之前没改的话就是这个);
- Username:填 postgres(PG 默认超级管理员,固定值);
- Password:填你安装 PG 时设置的密码(就是之前让你记在小本本上的那个,比如 123456);
- 勾选「Save password?」(保存密码,后续不用重复输入,本地开发可勾)。
-
-
点击「Save」,登录成功!左侧会展开你注册的服务器,能看到「Databases」(默认有3个系统数据库,相当于文件柜里的“系统文件夹”,别删!别删!别删!)。
验证登录:右键点击「Databases」下面的「postgres」数据库 → 「Query Tool...」,打开 SQL 编辑窗口,输入 SELECT version();,点击工具栏的「执行」(绿色三角),能看到 PG 的版本信息,就说明登录成功,能正常操作了!
小技巧:这个 SQL 编辑窗口,就是你“给文件柜发指令”的地方,后续所有 SQL 命令都在这里执行~
3.2 方式2:psql 命令行(进阶操作,解决新手常见报错)
很多新手打开 SQL Shell (psql),输入命令后会报错: psql: The term 'psql' is not recognized as a name of a cmdlet...
别慌!这不是你装错了,而是「系统没找到 psql 的路径」,给你两种解决方案,新手优先选临时解决,简单快捷!
方案1:临时解决(单次有效,不用改配置)
-
打开 psql 工具:从开始菜单找到「SQL Shell (psql)」,双击启动;
-
按提示输入参数(全程回车,除了密码):
- Server [localhost]:直接回车(默认 localhost);
- Database [postgres]:直接回车(默认登录 postgres 数据库);
- Port [5432]:直接回车(默认端口);
- Username [postgres]:直接回车(默认管理员);
- Password for user postgres:输入你安装时设置的密码(输入不显示任何字符,正常现象),回车。
-
登录成功:提示符变为
postgres=#,说明已经进入 PG 命令行交互环境,可直接输入 SQL 命令。
方案2:永久解决(任意目录可执行 psql,进阶用)
如果想在任意 cmd/PowerShell 窗口执行 psql 命令,需要配置环境变量,步骤如下:
- 找到 PG 的 bin 目录(默认路径):
C:\Program Files\PostgreSQL\16\bin; - 打开环境变量:右键「此电脑」→「属性」→「高级系统设置」→「环境变量」→ 找到「系统变量」里的「Path」,双击编辑;
- 新建路径:点击「新建」,粘贴 bin 目录路径,点击确定保存;
- 重启终端:关闭所有 cmd/PowerShell 窗口,重新打开,输入
psql -U postgres,输入密码即可登录。
psql 新手必记3个命令(够用了)
\l:查看所有数据库(相当于“看文件柜里所有文件夹”);\c 数据库名:切换数据库(相当于“打开某个文件夹”);\q:退出 psql(相当于“锁上文件柜”)。
三、第三步:核心操作!用 SQL 操控 PG(CRUD 实战,结合全栈场景)
登录成功后,重头戏来了——用 SQL 命令“操控文件柜”!这部分是核心,也是后续搭配 Drizzle ORM 的基础,全程用「用户-帖子」场景举例(和你之前学的 Drizzle Schema 对应),看完就能直接复用。
提示:以下所有 SQL 命令,无论是 pgAdmin 的 Query Tool,还是 psql 命令行,都能执行,新手建议用 pgAdmin,能看到直观的结果。
3.1 数据库操作(新建“文件柜”)
默认的3个系统数据库是“系统文件夹”,我们不要动,新建一个自己的数据库,用于开发(比如和 Drizzle 配套的数据库):
-- 新建数据库(drizzle_demo,自定义名字,小写为主)
CREATE DATABASE drizzle_demo;
-- 查看所有数据库(验证是否新建成功)
SELECT datname FROM pg_database;
-- 删除数据库(谨慎使用!不可逆,删错了哭死)
DROP DATABASE IF EXISTS drizzle_demo;
小技巧:新建数据库后,用 \c drizzle_demo(命令行)或右键点击数据库→「Connect」(pgAdmin),切换到这个数据库,再进行后续操作。
3.2 数据表操作(新建“文件夹”)
切换到 drizzle_demo 数据库后,新建两个表:users(用户表)和 posts(帖子表),帖子表关联用户表(外键),和你之前学的 Drizzle Schema 一一对应,方便后续衔接:
-- 新建 users 表(用户文件夹)
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自增主键(相当于文件夹自动编号,唯一不重复)
name VARCHAR(255) NOT NULL, -- 姓名(非空,不能空着)
email VARCHAR(255) NOT NULL UNIQUE, -- 邮箱(非空+唯一,不能重复,避免两个人用一个邮箱)
age INT, -- 年龄(可选,可填可不填)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间(默认当前时间,不用手动填)
);
-- 新建 posts 表(帖子文件夹),关联 users 表
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL, -- 帖子标题(非空)
content VARCHAR, -- 帖子内容(可选)
author_id INT NOT NULL REFERENCES users(id), -- 外键(关联用户表的id,相当于帖子属于某个用户)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
关键比喻:
- SERIAL:相当于“自动编号机”,给每个用户/帖子自动编一个唯一的编号(1、2、3...),不用手动输入;
- NOT NULL:相当于“文件夹标签不能为空”,比如姓名、邮箱,必须填写;
- UNIQUE:相当于“邮箱标签不能重复”,避免两个用户用同一个邮箱;
- REFERENCES:相当于“帖子文件夹和用户文件夹之间绑了一根绳子”,确保帖子一定属于某个存在的用户,不能乱绑。
查看表结构:输入 \d users(命令行)或右键点击表→「Properties」(pgAdmin),能看到表的字段、类型、约束,非常直观。
3.3 CRUD 操作(核心!增删改查,实战为王)
CRUD 就是“增删改查”,对应“给文件夹放文件、删文件、改文件、找文件”,是数据库操作的核心,全程用例子讲解,看完直接复制粘贴就能用!
1. 新增数据(Create:放文件)
-- 新增单个用户(给 users 表放一个“张三”的文件)
INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 25);
-- 新增多个用户(一次放多个文件,效率更高)
INSERT INTO users (name, email, age)
VALUES ('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);
-- 新增帖子(关联张三,假设张三的 id=1)
INSERT INTO posts (title, content, author_id)
VALUES ('Drizzle + PG 太香了', '新手也能轻松上手', 1);
2. 查询数据(Read:找文件)
-- 1. 查询所有用户(找出 users 文件夹里所有文件)
SELECT * FROM users;
-- 2. 条件查询(找 id=1 的张三,精准找文件)
SELECT * FROM users WHERE id = 1;
-- 3. 字段筛选(只找姓名和邮箱,不看其他标签)
SELECT name, email FROM users WHERE age > 25;
-- 4. 排序(按创建时间倒序,最新的用户排在前面)
SELECT * FROM users ORDER BY created_at DESC;
-- 5. 关联查询(找张三发的所有帖子,联动两个文件夹)
SELECT u.name, p.title
FROM users u
LEFT JOIN posts p ON u.id = p.author_id
WHERE u.id = 1;
小技巧:关联查询是全栈开发中最常用的操作,比如“显示用户的同时,显示他发的帖子”,用 LEFT JOIN 就能轻松实现,比 MySQL 的关联查询更简洁。
3. 更新数据(Update:改文件)
-- 更新张三的年龄,从25改成26(一定要加 WHERE,否则全表更新!)
UPDATE users
SET age = 26, name = '张三更新'
WHERE id = 1;
重点警告:UPDATE 命令一定要加 WHERE 条件!否则会把整个表的所有数据都改掉,比如忘记加 WHERE,就会把所有用户的年龄都改成26,哭都来不及!
4. 删除数据(Delete:删文件)
-- 删除 id=3 的王五(加 IF EXISTS 避免删错不存在的用户)
DELETE FROM users WHERE id = 3;
重点警告:DELETE 也是不可逆的,一定要加 WHERE 条件!另外,要先删有外键依赖的表(比如先删 posts,再删 users),否则会报错。
3.4 事务操作(进阶:保证数据一致性)
比如“更新张三年龄 + 给张三新增一个帖子”,这两个操作要同时成功,或者同时失败,不能只成功一个(比如年龄更了,帖子没加上,数据就乱了),这时候就需要用事务:
BEGIN; -- 开启事务(相当于“准备开始操作,没确认之前不生效”)
UPDATE users SET age = 27 WHERE id = 1;
INSERT INTO posts (title, content, author_id) VALUES ('事务测试', '数据一致性很重要', 1);
COMMIT; -- 提交事务(两个操作同时生效)
-- ROLLBACK; -- 回滚事务(出错时,撤销所有操作,回到开启前的状态)
比喻:事务就像“买东西付款”,付款和拿到东西要同时完成,付款成功但没拿到东西(事务失败),就会回滚(退款),保证双方都不吃亏。
四、第四步:无缝衔接 Drizzle ORM(全栈开发封神!)
如果你是 TS/JS 全栈开发者,学完 PG 后,一定要和 Drizzle ORM 衔接,这样就能“用代码操控 PG”,不用再手动写 SQL,还能实现类型安全,编译阶段就发现错误,香到起飞!
核心步骤(和你之前学的 Drizzle 对应,直接复用):
4.1 安装依赖(npm 安装,简单快捷)
-- 核心依赖:Drizzle ORM + PG 驱动
npm install drizzle-orm pg
-- 开发依赖:Drizzle 迁移工具
npm install -D drizzle-kit tsx
4.2 配置 Drizzle + 连接 PG
创建 src/db/index.ts,配置 PG 连接(用你之前新建的 drizzle_demo 数据库):
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
// 连接 PG 数据库(替换成你的密码和数据库名)
const pool = new Pool({
connectionString: 'postgresql://postgres:123456@localhost:5432/drizzle_demo',
});
// 初始化 Drizzle 实例
export const db = drizzle(pool);
// 导出数据表(后续用 Drizzle 操作表)
export * from './schema';
4.3 用 Drizzle 操作 PG(不用写 SQL!)
创建 src/db/queries.ts,用 Drizzle 实现 CRUD,比手动写 SQL 更简洁,还能享受 TS 类型提示:
import { db, users, posts } from './index';
// 新增用户(和 PG 的 INSERT 对应)
async function createUser() {
const newUser = await db
.insert(users)
.values({ name: '赵六', email: 'zhaoliu@example.com', age: 24 })
.returning();
return newUser[0];
}
// 查询用户及帖子(和 PG 的 JOIN 对应)
async function getUserWithPosts(userId: number) {
return await db
.select({ user: users, posts: posts })
.from(users)
.leftJoin(posts, users.id.eq(posts.authorId))
.where(users.id.eq(userId));
}
// 调用函数,操控 PG
createUser().then(user => console.log('新增用户:', user));
运行代码:npx tsx src/db/queries.ts,就能看到新增的用户,说明 Drizzle 和 PG 已经成功衔接,全栈开发的数据库环节彻底打通!
五、新手避坑大全(踩过的坑,全帮你避开了)
整理了新手最容易踩的5个坑,每个坑都有解决方案,看完少走100弯路!
坑1:psql 命令报错“不识别”
解决方案:用「SQL Shell (psql)」启动,或配置环境变量(参考前文 3.2 节),别在任意 cmd 窗口直接输 psql。
坑2:忘记 postgres 密码,无法登录
解决方案:
- 停止 PG 服务:Win+R 输入
services.msc,找到「postgresql-x64-16」,右键停止; - 修改配置文件:打开
C:\Program Files\PostgreSQL\16\data\pg_hba.conf,把所有md5改成trust; - 重启服务,用 psql 免密登录,执行
ALTER USER postgres WITH PASSWORD '新密码';; - 把 pg_hba.conf 改回
md5,重启服务,用新密码登录。
坑3:Stack Builder 乱勾应用,导致安装失败
解决方案:安装 PG 时,直接取消勾选“Launch Stack Builder”,新手用不到任何附加应用,后续需要再单独安装。
坑4:UPDATE/DELETE 忘记加 WHERE,全表修改/删除
解决方案:养成习惯,写 UPDATE/DELETE 时,先写 WHERE 条件,再写 SET/DELETE,或者用 Drizzle ORM,类型提示会提醒你。
坑5:外键关联报错,无法删除/新增数据
解决方案:先删除有外键依赖的数据(比如先删 posts,再删 users),新增时确保外键对应的 id 存在。
六、总结:PG 新手封神之路,其实很简单
看到这里,你已经掌握了 PG 的核心使用:安装 → 登录 → 建库建表 → CRUD → 衔接 Drizzle ORM,足以应对 TS/JS 全栈开发的大部分场景。
最后再总结一句:PG 不是“高冷难搞的大佬”,而是“全能又温顺的开发伙伴”,它比 MySQL 功能更强大,比其他数据库更适配 TS/JS 生态,只要跟着这篇文章一步步练,新手也能快速上手。
后续进阶可以学习 PG 的 JSON 类型、索引优化、备份恢复,这些功能在全栈开发中会越来越常用。
福利时间:评论区回复「PG 资料」,获取我整理的「PG 常用 SQL 手册 + Drizzle 完整示例代码」,直接复制粘贴就能用!
如果这篇文章帮你避开了 PG 的坑,记得点赞收藏,关注我,后续更新更多 TS/JS 全栈开发干货~ 🚀