搞钱啊

Prisma ORM 从入门到熟练

📘 Prisma ORM 从入门到熟练

🧭 目录


1. 什么是 Prisma ORM?

Prisma 是一个现代的、类型安全的 ORM(对象关系映射)工具,主要用于 TypeScript/JavaScript 项目中,帮助企业开发者更高效地操作数据库。

📌 特点:

  • 类型安全:利用 TypeScript 提供强类型,在编译期捕获错误。
  • 数据库抽象:支持多个数据库(如 PostgreSQL, MySQL, SQLite, MongoDB)。
  • 数据模型可视化:通过 Prisma Studio 实现直观的数据浏览和管理。
  • 数据库迁移:通过 prisma migrate 实现结构化数据库变更。
  • 性能优化:提供自动化的查询构建和关系查询。

2. Prisma 的核心概念

🧩 数据模型(Data Model)

使用 Prisma 首先需要定义数据模型。这个模型是数据库的结构化表示,用 Prisma Schema 文件描述。

🧩 数据库迁移(Database Migration)

Prisma 提供了自动化的迁移功能,将模型定义转换为数据库操作。

🧩 Prisma Client

Prisma Client 是 Prisma 提供的类型安全的数据库操作客户端。它根据你的模型自动生成代码。

🧩 Prisma Studio

Prisma Studio 是一个图形化的工具,允许你可视化地查看和操作数据库。


3. 安装与初始化

⚙️ 安装 Prisma CLI

npm install prisma --save-dev

yarn add prisma

✅ 初始化 Prisma

npx prisma init

此命令会初始化 Prisma 项目,并创建以下文件:

  • prisma/prisma.schema:数据模型定义文件
  • prisma/.env:数据库连接信息

4. 数据模型定义(Prisma Schema)

Prisma 提供了一种类似于 GraphQL 的 DSL(领域特定语言)用于定义模型。

📝 示例:定义用户模型

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String
  author    User?    @relation("PostToUser")
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

💡 说明:

  • @id 表示主键
  • @unique 表示唯一约束
  • @default(autoincrement()) 表示自动生成自增 ID
  • @relation("PostToUser") 表示模型之间的关系(可选)

5. 数据库迁移与部署

Prisma 支持 prisma migrate 命令来创建迁移文件,并应用到数据库中。

🔄 创建迁移

npx prisma migrate dev --name init
  • 这会根据当前的 prisma.schema 创建迁移,并在本地数据库中执行。

⚙️ 配置数据库连接(.env 文件)

DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"
  • DATABASE_URL 是必需的配置项。
  • 根据你使用的数据库类型填写对应的 URL。

📦 应用迁移到生产环境(可选)

npx prisma migrate deploy
  • 如果部署到生产环境,需要确保 .env 文件中的 URL 是正确的。

6. 数据库操作(查询和操作)

Prisma Client 提供了类型安全的数据库操作接口。

📂 安装 Prisma Client

在使用 Prisma Client 前,你需要先生成它:

npx prisma generate

👨‍💻 基本查询示例

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

// 查询所有用户
const users = await prisma.user.findMany()
console.log(users)

// 查询一个用户
const user = await prisma.user.findUnique({
  where: { id: 1 },
})

// 查询用户下的所有文章
const posts = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true },
})

✍️ 常见操作(增删改查)

操作 示例代码
创建 await prisma.user.create({ data: { ... } })
更新 await prisma.user.update({ where: { id: 1 }, data: { name: 'New Name' } })
删除 await prisma.user.delete({ where: { id: 1 } })
查询 await prisma.user.findUnique/findMany/findFirst

7. 数据库连接配置(Prisma Client)

Prisma 的连接配置主要通过 .env 文件完成。

📄 .env 示例

DATABASE_URL="postgresql://myuser:mypassword@localhost:5432/mydb?schema=public"

🔍 查看当前连接配置

npx prisma info

🔄 生成新的 Prisma Client

npx prisma generate

8. 高级特性

🔍 Prisma Studio

Prisma Studio 是一个图形化工具,可以直接连接数据库进行数据管理。

npx prisma studio
  • 可以查看所有模型数据、创建、编辑、删除记录等。

⚙️ 关系查询

Prisma 的关系查询非常强大,支持嵌套查询、关系过滤、分页等。

await prisma.user.findUnique({
  where: { id: 1 },
  include: {
    posts: {
      where: { published: true },
      take: 3,
    },
  },
})

🧠 查询优化(Prisma Client 中的 query builders)

Prisma Client 提供了灵活的查询构建器,可以组合多个查询语句。

🔁 数据库事务

Prisma 支持事务(transactions)操作,保证数据的一致性。

await prisma.$transaction([
  prisma.user.create({ data: { ... } }),
  prisma.post.create({ data: { ... } }),
])

🧠 分页与游标(cursor-based pagination)

Prisma 支持游标分页,提高性能。

const posts = await prisma.post.findMany({
  take: 5,
  cursor: { id: 10 },
})

9. 最佳实践与性能优化

✅ 初始化建议

  • 使用 prisma init 快速初始化项目。
  • 选择你常用的数据库类型(如 PostgreSQL、MySQL 等)。
  • 保持 prisma.schema 与数据库结构一致。

🚀 性能优化建议

  1. 使用 Prisma Studio 进行数据调试
  2. 避免 N+1 查询问题
  3. 使用 includeselect 优化查询结构
  4. 使用缓存
  5. 在生产环境中使用 prisma migrate deploy

📝 代码结构建议

  • 将 Prisma Client 实例保存在 index.tsprisma-client 模块中,供全局使用。
  • 为每个操作模块封装单个逻辑(如用户模块、文章模块)。
  • 使用 TypeScript 的类型兼容性,避免运行时错误。

10. 常见问题与解决方案

❓ Q1: Prisma 迁移失败怎么办?

A: 检查迁移生成的 SQL 文件,确认是否有语法错误。也可以尝试手动运行迁移 SQL。

❓ Q2: Prisma Client 生成后没更新怎么办?

A: 检查 prisma.schema 是否有修改,运行 npx prisma generate 以重新生成 Client。

❓ Q3: 多个数据库怎么办?

A: 使用 prisma.schemagenerator 配置,或者通过不同的 Prisma Client 实例分别连接到不同数据库。

❓ Q4: 如何调试 Prisma 查询?

A: 使用 prisma.$queryRawprisma.$executeRaw 执行原生 SQL,查看执行日志。

  • 也可以在 .env 中开启日志:
PRISMA_LOGGING="true"

📌 备注

  • 请确保你的项目使用 TypeScript,因为 Prisma 原生支持 TypeScript。
  • 如果你使用的是 Node.js,记得安装 @prisma/client 作为依赖项。
  • Prisma 的文档非常详细,可以参考官方 Prisma Docs 获取更多帮助。

📌 推荐学习路径

  1. 学习 Prisma 的基本语法(prisma.schema, Prisma Client 的用法)
  2. 完成迁移与数据库连接配置
  3. 练习使用嵌套查询、关系操作
  4. 探索 Prisma Studio 和查询日志
  5. 尝试高级特性(如事务、分页、自定义查询语句)

✅ 小结

阶段 内容
入门 安装、初始化、定义模型
熟练 迁移、查询、关系操作
高级 事务、分页、Prisma Studio 使用

📚 参考链接