主题
Prisma 完整代码示例
本目录包含 Prisma 章节的所有可运行代码示例。所有代码包含详细注释和日志输出,可以直接复制到项目中使用。
📁 目录结构
examples/
├── schema/ # Prisma Schema 定义
│ ├── full-schema.prisma # 完整的博客系统 Schema
│ └── README.md # Schema 使用说明
├── queries/ # 查询操作示例
│ ├── basic-crud.ts # CRUD 基础操作
│ ├── relations.ts # 关系查询(include, select)
│ ├── transactions.ts # 事务处理
│ ├── n-plus-one-solution.ts # N+1 问题解决方案
│ └── README.md # 查询示例说明
├── migrations/ # 迁移管理
│ └── README.md # 迁移最佳实践
├── nextjs-integration/ # Next.js 集成
│ ├── lib/prisma.ts # Prisma Client 单例
│ ├── app/users/page.tsx # Server Component 示例
│ ├── app/api/users/route.ts # API Route 示例
│ ├── app/actions.ts # Server Actions 示例
│ └── README.md # Next.js 集成说明
└── README.md # 本文件🚀 快速开始
1. 安装依赖
bash
npm install prisma @prisma/client
npm install -D typescript @types/node ts-node2. 初始化 Prisma
bash
npx prisma init这会创建:
prisma/schema.prisma- Prisma Schema 文件.env- 环境变量文件
3. 配置数据库连接
编辑 .env 文件:
env
# PostgreSQL
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"
# MySQL
DATABASE_URL="mysql://user:password@localhost:3306/mydb"
# SQLite(开发环境)
DATABASE_URL="file:./dev.db"4. 复制 Schema
将 schema/full-schema.prisma 的内容复制到 prisma/schema.prisma。
5. 创建迁移
bash
# 创建并应用迁移
npx prisma migrate dev --name init
# 这会:
# ✅ 生成 SQL 迁移脚本
# ✅ 执行迁移到数据库
# ✅ 生成 Prisma Client6. 运行示例代码
bash
# 运行 CRUD 示例
npx ts-node examples/queries/basic-crud.ts
# 运行关系查询示例
npx ts-node examples/queries/relations.ts
# 运行事务示例
npx ts-node examples/queries/transactions.ts
# 运行 N+1 问题解决方案
npx ts-node examples/queries/n-plus-one-solution.ts📚 章节索引
1. Schema 定义
包含:
- ✅ 所有关系类型(一对一、一对多、多对多)
- ✅ 枚举类型
- ✅ 索引优化
- ✅ 默认值和自动更新
- ✅ 级联操作
适用场景: 新项目设计数据库 Schema
2. CRUD 操作
包含:
- ✅ 创建记录(create, createMany, upsert)
- ✅ 查询记录(findMany, findUnique, findFirst)
- ✅ 更新记录(update, updateMany)
- ✅ 删除记录(delete, deleteMany)
- ✅ 聚合查询(count, aggregate, groupBy)
- ✅ 分页查询(skip, take)
适用场景: 学习 Prisma 的基础 API
3. 关系查询
包含:
- ✅
include- 包含关联数据 - ✅
select- 精确选择字段 - ✅ 嵌套查询(多层 include/select)
- ✅ 关系过滤(some, every, none)
- ✅ 关系操作(connect, disconnect, create)
- ✅ 多对多关系(隐式 vs 显式)
适用场景: 处理复杂的关联查询
4. 事务处理
包含:
- ✅ 顺序事务(数组形式)
- ✅ 交互式事务(回调形式)
- ✅ 事务错误处理和回滚
- ✅ 隔离级别(Read Committed, Serializable 等)
- ✅ 实际业务场景(订单创建)
适用场景: 需要保证数据一致性的操作
5. N+1 问题解决
文件: queries/n-plus-one-solution.ts
包含:
- ❌ N+1 问题示例(查询 1001 次)
- ✅ 解决方案 1: 使用
include(查询 1-2 次) - ✅ 解决方案 2: 使用
select(减少数据传输) - ✅ 解决方案 3: 手动批量查询(WHERE ... IN)
- ✅ 解决方案 4: 使用
_count(只需要数量时) - ✅ 解决方案 5: 关系过滤 + 限制数量
- ✅ 性能对比和选择建议
适用场景: 优化查询性能,避免数据库爆炸
6. 迁移管理
包含:
- ✅ 迁移基本流程
- ✅ 添加/删除字段
- ✅ 重命名字段(保留数据)
- ✅ 修改字段类型
- ✅ 添加关系和索引
- ✅ 生产环境迁移(migrate deploy)
- ✅ 团队协作最佳实践
- ✅ 破坏性变更处理
适用场景: 管理数据库 Schema 演变
7. Next.js 集成
7.1 Prisma Client 单例
文件: nextjs-integration/lib/prisma.ts
包含:
- ✅ 全局单例模式(防止热重载创建多个实例)
- ✅ 开发/生产环境配置
- ✅ 日志配置
- ✅ 优雅关闭
适用场景: 在 Next.js 中初始化 Prisma
7.2 Server Component
文件: nextjs-integration/app/users/page.tsx
包含:
- ✅ 在 Server Component 中直接使用 Prisma
- ✅ 异步查询和渲染
- ✅ 元数据(SEO 优化)
- ✅ Streaming 和 Suspense
适用场景: 页面级别的数据查询
7.3 API Route
文件: nextjs-integration/app/api/users/route.ts
包含:
- ✅ GET 请求(查询列表、分页、搜索)
- ✅ POST 请求(创建记录)
- ✅ DELETE 请求(批量删除)
- ✅ 错误处理(Prisma 错误码)
- ✅ 返回 JSON 响应
适用场景: 提供 RESTful API
7.4 Server Actions
文件: nextjs-integration/app/actions.ts
包含:
- ✅ 表单提交处理
- ✅ 数据验证
- ✅ 创建、更新、删除操作
- ✅
revalidatePath(缓存刷新) - ✅
redirect(页面跳转) - ✅ 事务处理
适用场景: 表单提交和数据修改
🎯 学习路径
初学者
- Schema 设计 →
schema/full-schema.prisma - CRUD 操作 →
queries/basic-crud.ts - 关系查询 →
queries/relations.ts - Next.js 集成 →
nextjs-integration/
进阶者
- 事务处理 →
queries/transactions.ts - 性能优化 →
queries/n-plus-one-solution.ts - 迁移管理 →
migrations/README.md
💡 常见问题
Q: 如何在 Next.js 中使用这些示例?
- 复制
nextjs-integration/lib/prisma.ts到项目的lib/prisma.ts - 在 Server Component、API Route 或 Server Actions 中导入:typescript
import { prisma } from '@/lib/prisma'; - 直接使用 Prisma Client
Q: 为什么需要全局单例?
Next.js 开发模式下,热重载会重新加载模块,每次都 new PrismaClient() 会创建新的数据库连接,最终耗尽连接池。使用 globalThis 存储实例可以在热重载时复用。
Q: 如何处理 Prisma 错误?
typescript
import { Prisma } from '@prisma/client';
try {
await prisma.user.create({ data });
} catch (error) {
if (error instanceof Prisma.PrismaClientKnownRequestError) {
// P2002: Unique constraint failed
if (error.code === 'P2002') {
console.error('邮箱已存在:', error.meta?.target);
}
}
}Q: 如何优化查询性能?
- 避免 N+1 问题 → 使用
include或手动批量查询 - 减少数据传输 → 使用
select只查询需要的字段 - 添加索引 → 为 WHERE、ORDER BY 的字段添加
@@index - 使用
_count→ 只需要数量时,不拉取完整数据
Q: 开发环境和生产环境的迁移有什么区别?
| 环境 | 命令 | 行为 |
|---|---|---|
| 开发 | migrate dev | 创建迁移 + 执行 + 生成 Client |
| 生产 | migrate deploy | 只执行未应用的迁移 |
⚠️ 重要: 生产环境绝不能用 migrate dev,它会重置数据库!
🔗 相关章节
- Chapter 03: Prisma Database - 主章节
- Chapter 04: tRPC - tRPC 会复用 Prisma 的查询逻辑