Vibe Tutorial
数据持久化与数据库

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. 本章小结

  1. 🔡 CRUD:增删改查是所有应用的基础。
  2. 🔗 关联查询:用 include 可以在一次查询里把相关联的数据都抓回来。
  3. 🗑️ 手下留情:尽量用软删除代替物理删除,给自己留后悔药。