Prisma知识点
一、从抽象说起(MVC → ORM)
编程领域有一句金句:不要重复造轮子。而这背后的操作就是抽象,把共性的东西抽离出来。
可以看到,不管写什么业务系统,底层逻辑几乎都是数据的增删改查(CRUD),上层则是数据的展示和交互。
在软件架构中,经典的 MVC 模式(Model-View-Controller)可以这样理解:
-
Model(数据层):负责数据存储和结构定义(数据库)
-
View(视图层):负责数据的展示(前端页面)
-
Controller(控制层):负责接收请求、处理业务、返回结果(后端逻辑)
为了让项目更清晰、可维护,很多团队会把 Controller 再细分成几层:
Router → Controller → Service → Model(ORM)
-
Router(路由层):把 URL 路径映射到具体的 Controller 方法
-
Controller(控制器层):接收请求,调用 Service 处理逻辑,返回统一的响应格式
-
Service(业务层):编写业务逻辑(例如订单计算、权限校验)
-
Model(数据层):操作数据库,通常会用 ORM 来简化
重点:ORM 是 Model 层的实现方式,并不和 MVC 平级。
二、谈 ORM
ORM 全称 Object-Relational Mapping(对象关系映射),核心思想是:
把数据库的表结构映射为编程语言里的对象,用对象的方法来读写数据库,而不是手写 SQL。
好处:
-
跨数据库:同一套代码可以适配 MySQL、Postgres、SQLite 等不同数据库
-
更贴近业务:操作对象更符合开发者思维
-
类型安全:配合 TypeScript,可以在编译期发现错误
-
安全性:避免手写 SQL 时的 SQL 注入风险
-
迁移管理:内置 Migration 功能管理数据库版本
示例
如果数据库里有一个 student 表:
-- SQL 写法
SELECT * FROM student;
// ORM 写法
const students = await prisma.student.findMany();
可读性和可维护性显著提高。
三、谈 Prisma
市面上的 ORM 工具有很多,比如 TypeORM、Sequelize、Knex……
我选择 Prisma 的原因很简单:
-
上手快,API 设计直观
-
TypeScript 支持好
-
自动生成类型提示
-
内置 Migration 和可视化工具(prisma studio)
虽然 Prisma 在性能上可能不是最强,但大多数中小项目性能瓶颈不会出在 ORM 上。
1. 新数据库场景
# 安装 Prisma CLI(开发依赖)
npm install prisma --save-dev
# 安装 Prisma Client(运行时依赖)
npm install @prisma/client
# 初始化项目(默认 SQLite)
npx prisma init --datasource-provider sqlite
这会生成:
-
prisma/schema.prisma:数据库模型定义文件
-
.env:数据库连接信息(⚠ 不要提交到 Git)
编辑 schema.prisma,定义模型,例如:
model User {
id Int @id @default(autoincrement())
name String?
account String @unique
password String
role String
}
然后执行迁移命令,创建数据库和表结构:
npx prisma migrate dev --name init
2. 现有数据库场景
如果数据库已经存在:
# 安装依赖
npm install prisma --save-dev
npm install @prisma/client
# 初始化 Prisma
npx prisma init --datasource-provider mysql
# 在 .env 中配置现有数据库连接地址
# 从数据库反向生成模型
npx prisma db pull
这样 Prisma 会根据现有表结构自动生成 schema.prisma 模型。
四、Prisma 常用命令
# 打开可视化数据库工具
npx prisma studio
# 推送模型更改到数据库(无迁移)
npx prisma db push
# 生成客户端(更新类型定义)
npx prisma generate
五、常见坑和技巧
-
全局唯一 PrismaClient
-
不要在每个请求里 new PrismaClient(),会造成连接过多
-
推荐在单例文件里初始化一次并导出
-
-
类型推导
- Prisma 会根据 schema.prisma 自动生成类型定义,配合 TypeScript 开发体验极佳
-
关联查询
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true }
});
-
数据验证
- Prisma 保证数据库层面的约束,但业务校验依然要在 Service 或 Controller 层处理
-
生产环境迁移
- 建议用 prisma migrate deploy,避免覆盖数据
到这里,你就能用 Prisma 快速启动一个项目,无论是新建数据库还是接入现有数据库。
它的核心价值就是——让你专注于业务,而不是 SQL。