Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← Web 开发 / Web Development

数据库与数据访问 / Databases & Data Access

1. 数据库全景学习路线 / A Complete Database Learning Path

2. MySQL 实战——互联网标配关系型数据库 / Practical MySQL for Internet Applications

3. PostgreSQL 深度——功能最全的开源 RDBMS / PostgreSQL as a Feature-Rich Open-Source RDBMS

4. SQLite 嵌入式——零配置的极致轻量 / SQLite as a Lightweight Embedded Database

5. MongoDB 文档型数据库——灵活结构的代表 / MongoDB and Flexible Document Data Models

6. Redis 全方位——不只是缓存 / Redis Beyond Caching

7. 嵌入式 KV 数据库——基础设施层的隐形支柱 / Embedded Key-Value Databases for Infrastructure

8. NewSQL 分布式数据库——规模化关系型数据 / Distributed SQL for Relational Data at Scale

9. 向量数据库——AI 时代的语义基础设施 / Vector Databases as Semantic Infrastructure for AI

10. OLAP 列式数据库——极速分析引擎 / Columnar OLAP Databases for Fast Analytics

11. 时序数据库——时间线数据的专业存储 / Time-Series Databases for Timeline Data

12. 数据库选型决策指南——从理论到实践 / A Practical Guide to Database Selection

13. ORM 与 Prisma 完全指南 / A Complete Guide to ORMs and Prisma

本页目录

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
1

这种方式既容易写错,又容易被 SQL 注入攻击。

Prisma 是目前 Node.js 生态里最现代、最易用的 ORM —— 用操作对象的方式来操作数据库。


2. Prisma 在代码结构中长什么样? ​

my-app/
├── prisma/
│   └── schema.prisma    ← 【核心:数据库蓝图】
├── .env                 ← 【连接:存放数据库地址】
├── src/
│   └── lib/
│       └── prisma.ts    ← 【实例:在代码里调用它】
└── package.json
1
2
3
4
5
6
7
8

第一步:定义蓝图 (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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

3. ORM 到底怎么"使用"?(对比 SQL) ​

运行 npx prisma db push 后,在后端代码里就可以这样写:

场景:新增一个用户 ​

方式代码
传统 SQLINSERT INTO User (email, name) VALUES ('test@abc.com', '张三')
Prisma ORMprisma.user.create({ data: { email: 'test@abc.com', name: '张三' } })

场景:查询用户及其所有的帖子(ORM 最强大的地方) ​

方式代码
传统 SQL需要写复杂的 LEFT JOIN 语句
Prisma ORMprisma.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 时,编辑器会自动提示哪些字段必填    │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

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 push
1
2
3
4
5
6
7
8

8. 常见问题 ​

小贴士:如果 db push 失败了,通常是因为服务器的 IP 没有加到 TiDB 的白名单里。


总结 ​

概念说明
ORM把数据库表变成代码里的"对象"
schema.prisma数据库蓝图,用代码定义表结构
prisma generate生成带类型的操作工具
prisma db push同步数据库结构
部署三部曲npm install → prisma generate → prisma db push

最后更新于:

Pager
上一篇12. 数据库选型决策指南——从理论到实践 / A Practical Guide to Database Selection

持续记录,持续成长

Copyright © Tidenflow