数据持久化与数据库
7.7 CRUD 操作详解
Tip
掌握这四个操作,你就掌握了后端开发 90% 的工作内容。
1. 为什么要学这个?
你的工具和环境都准备好了,现在业务方提了一个最简单的需求: "给我做一个后台管理页面,能看到所有注册用户,也能把违规用户踢掉。"
如果你不懂 CRUD,面对这个需求你只能发呆。 因为几乎所有的互联网产品,本质上都只是在对数据库不断地做这四件事。
学会 CRUD,你就真正拥有了对数据的"生杀大权"。
2. 核心概念
CRUD 是四个单词的首字母缩写,代表了数据的整个生命周期。
通讯录比喻
想象你在管理手机里的通讯录,这和操作数据库是一模一样的:
- Create (增):存一个新号码 -> 用户注册
- Read (查):搜一下"老王"的电话 -> 获取文章列表
- Update (改):给"老王"改备注叫"隔壁老王" -> 修改密码
- Delete (删):把前任的号码删掉 -> 注销账号
3. 实战体验
Prisma 的设计哲学是:像读英语一样写代码。
第一步:Create (存号码)
// 翻译:去 User 表,帮我 create 一个,data 是...
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@vibe.com'
}
})
第二步:Read (查号码)
这是最常用的功能。
// 查一个 (Find Unique)
const user = await prisma.user.findUnique({
where: { email: 'alice@vibe.com' }
})
// 查所有 叫 Alice 的人 (Find Many)
const users = await prisma.user.findMany({
where: { name: 'Alice' }
})
第三步:Update (改备注)
// 翻译:去 User 表,update 那个 id 是 1 的人,把 name 改成 'Super Alice'
const user = await prisma.user.update({
where: { id: 1 },
data: { name: 'Super Alice' }
})
第四步:Delete (删号码)
const user = await prisma.user.delete({
where: { id: 1 }
})
4. 必杀技:关联查询
如果你想在查文章的同时,顺便把作者是谁也查出来,在 SQL 里你需要写复杂的 JOIN 命令。
但在 Prisma 里,你只需要加一句 include。
const posts = await prisma.post.findMany({
include: {
author: true // ✅ 顺便把 author (作者) 也带回来!
}
})
// 结果:你在 posts 里直接就能读到 author.name
流程图
graph LR
Req["你的请求"] -->|"findMany + include"| Prisma
Prisma -->|"自动生成 JOIN 语句"| SQL["SELECT * FROM Post JOIN User..."]
SQL --> DB[数据库]
DB -->|"返回原始数据"| Prisma
Prisma -->|"组装成嵌套对象"| Res["Post { author: { ... } }"]
5. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 💡 为什么 |
|---|---|---|
一次性 findMany() |
总是加上 take: 10 (分页) |
如果表里有 100 万条数据,一次性全查出来会把服务器内存撑爆。 |
真的 delete 数据 |
使用 软删除 (标记 deleted=true) | 真实世界里,数据即使被删除了也有分析价值。物理删除了就真找不回来了。 |
相信 findFirst 是唯一的 |
只有 findUnique 才是唯一的 |
findFirst 只是"碰巧"查到了第一个,不能保证以后还是它。 |
6. 真实案例
Story
GitLab 删库事故 (2017)
2017年,GitLab 的一位工程师本想清理从库的垃圾数据,结果误在主库上执行了物理删除命令。 300GB 的生产数据瞬间消失。 当他们试图恢复备份时,发现之前的 5 种备份机制全部失效。最后不得不从一位工程师电脑里找到 6 小时前的临时备份来恢复。
Vibe 心法:除了法律规定的必须删除,永远优先选择**"软删除"**(给数据打个"已删除"的标签,而不是真的删掉它)。数据就是公司的资产,不要随意销毁资产。
7. 本章小结
- 🔡 CRUD:增删改查是所有应用的基础。
- 🔗 关联查询:用
include可以在一次查询里把相关联的数据都抓回来。 - 🗑️ 手下留情:尽量用软删除代替物理删除,给自己留后悔药。