ORM 与 Prisma 完全指南 / A Complete Guide to ORMs and Prisma
解释 ORM 是什么,Prisma 如何使用,以及部署时的核心命令。
1. ORM 是什么?
把 ORM (Object-Relational Mapping) 想象成一个**"自动翻译官"**。
在没有 ORM 的年代,后端程序员得在代码里手写 SQL 字符串:
sql
SELECT * FROM users WHERE id = 1这种方式既容易写错,又容易被 SQL 注入攻击。
Prisma 是目前 Node.js 生态里最现代、最易用的 ORM —— 用操作对象的方式来操作数据库。
2. Prisma 在代码结构中长什么样?
my-app/
├── prisma/
│ └── schema.prisma ← 【核心:数据库蓝图】
├── .env ← 【连接:存放数据库地址】
├── src/
│ └── lib/
│ └── prisma.ts ← 【实例:在代码里调用它】
└── package.json第一步:定义蓝图 (schema.prisma)
你不需要去数据库里敲 CREATE TABLE,只需用类似 TypeScript 的语法写下模型:
prisma
// prisma/schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[] // 一对多关系:一个用户有多个帖子
}
model Post {
id Int @id @default(autoincrement())
title String
author User @relation(fields: [authorId], references: [id])
authorId Int
}3. ORM 到底怎么"使用"?(对比 SQL)
运行 npx prisma db push 后,在后端代码里就可以这样写:
场景:新增一个用户
| 方式 | 代码 |
|---|---|
| 传统 SQL | INSERT INTO User (email, name) VALUES ('test@abc.com', '张三') |
| Prisma ORM | prisma.user.create({ data: { email: 'test@abc.com', name: '张三' } }) |
场景:查询用户及其所有的帖子(ORM 最强大的地方)
| 方式 | 代码 |
|---|---|
| 传统 SQL | 需要写复杂的 LEFT JOIN 语句 |
| Prisma ORM | prisma.user.findUnique({ where: { email: 'test@abc.com' }, include: { posts: true } }) |
4. Prisma 的核心工作流
使用 Prisma 一般遵循这个循环:
┌─────────────────────────────────────────────────────────────┐
│ 1. Modify Schema │
│ 在 schema.prisma 里增加或修改字段 │
│ (比如给 User 加个 password 字段) │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 2. Push/Migrate: npx prisma db push │
│ Prisma 自动对比代码和远程数据库(TiDB) │
│ 发现数据库少了 password 列 → 自动发 SQL 补上 │
└─────────────────────┬───────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 3. Generate Client │
│ 生成带类型提示的代码 │
│ 写 prisma.user.create 时,编辑器会自动提示哪些字段必填 │
└─────────────────────────────────────────────────────────────┘5. 服务器上为什么要跑 npx prisma?
在服务器上执行 npx prisma 系列命令,本质上是做**"环境同步"**:
| 比喻 | 说明 |
|---|---|
| 代码 | 说明书 |
| 数据库 (TiDB) | 原材料 |
| npx prisma | 施工队 —— 把说明书变成现实 |
两个核心命令
① npx prisma generate(生成代码助手)
- 作用:在 node_modules 里生成一个"数据库操作工具包"
- 为什么需要:你的代码写了
prisma.user.findMany(),但 Node.js 不认识 user 是什么 - 效果:生成带 TypeScript 类型提示的代码,编辑器才知道 user 表有哪些字段
- 什么时候跑:每次
npm install后,或修改了 schema.prisma 后
② npx prisma db push(同步数据库结构)
- 作用:让远程数据库(TiDB)长成你想要的样子
- 背景:代码里定义了 Password 模型,但 TiDB 可能还是空的
- 效果:Prisma 会自动发送
CREATE TABLE的 SQL 指令 - 为什么在服务器跑:开发和生产环境连接的可能是不同的数据库实例
6. 为什么不只在本地操作?
这就是 CI/CD 和自动化部署 的核心逻辑:
| 好处 | 说明 |
|---|---|
| 一致性 | 保证"代码定义"和"数据库现实"永远同步 |
| 安全性 | 不需要手动登录 TiDB 后台写危险的 SQL |
| 无感化 | 用 GitHub Actions 可配置成自动执行 |
7. 服务器部署的标准三部曲
当 git clone 代码到服务器后,通常执行:
bash
# 1. 下载所有依赖
npm install
# 2. 根据蓝图生成操作工具(Client)
npx prisma generate
# 3. 确保 TiDB 里的表结构是最新的
npx prisma db push8. 常见问题
小贴士:如果 db push 失败了,通常是因为服务器的 IP 没有加到 TiDB 的白名单里。
总结
| 概念 | 说明 |
|---|---|
| ORM | 把数据库表变成代码里的"对象" |
| schema.prisma | 数据库蓝图,用代码定义表结构 |
| prisma generate | 生成带类型的操作工具 |
| prisma db push | 同步数据库结构 |
| 部署三部曲 | npm install → prisma generate → prisma db push |