学习笔记

Prisma知识点

#编程学习 #ORM #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

五、常见坑和技巧

  1. 全局唯一 PrismaClient

    • 不要在每个请求里 new PrismaClient(),会造成连接过多

    • 推荐在单例文件里初始化一次并导出

  2. 类型推导

    • Prisma 会根据 schema.prisma 自动生成类型定义,配合 TypeScript 开发体验极佳
  3. 关联查询

const userWithPosts = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }
});
  1. 数据验证

    • Prisma 保证数据库层面的约束,但业务校验依然要在 Service 或 Controller 层处理
  2. 生产环境迁移

    • 建议用 prisma migrate deploy,避免覆盖数据

到这里,你就能用 Prisma 快速启动一个项目,无论是新建数据库还是接入现有数据库。

它的核心价值就是——让你专注于业务,而不是 SQL