记一次 Prisma 6 升级 7 的评估与升级指南
博客的 Prisma 一直停在 6.2.1,最近看到 Prisma 7 的发布博客,说是把 Rust 引擎整个干掉了,换成了纯 TypeScript/WASM,包体积从 14MB 缩到 1.6MB,查询号称快 3 倍。说实话挺心动的,但这种大版本升级不搞清楚不敢动。于是我花了点时间做了一次完整的评估,顺便把升级步骤也理了一遍。
为什么 Prisma 7 值得关注
Prisma 这个版本最大的变化是把 Rust 写的查询引擎换成了纯 TypeScript。听起来像是技术债清理,但实际收益挺实在的:
- 包体积缩小 90%:从 ~14MB 降到 ~1.6MB,Docker 镜像更小,部署更快
- 查询性能提升:官方号称 3 倍,社区实测大概 1.5-2 倍,但冷启动确实快了
- Edge 支持:不再依赖平台特定的二进制文件,Cloudflare Workers、Vercel Edge 都能跑了
- TypeScript 贡献门槛降低:核心引擎是 TS 了,社区修 bug 不用再编译 Rust
说实话,包体积和冷启动的改善对我的 Next.js 博客影响不算大,但维护成本确实在降低。Prisma 6 已经不会再有新特性了,迟早要升。
我的博客现状
先看一眼当前的配置:
prisma
generator client {
provider = "prisma-client-js"
output = "../src/generated/prisma-client"
binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
几个关键信息:
- Prisma 版本:6.2.1
- 数据库:MySQL
- Node.js:22(Docker 用的 node:22-alpine)
$use中间件:没用过 ✅$queryRaw:没用过 ✅- PrismaClient 实例化:单例模式,只在
src/lib/prisma.ts一处 - Import 文件数:大约 20 个文件引用
@/generated/prisma-client
好消息是,这个项目的技术栈已经满足了 Prisma 7 的大部分前置要求:Node 22、ESM 开启、moduleResolution: bundler。坏消息是,有 20 个文件的 import 路径要改。
Breaking Changes 梳理
我挨个对照官方文档过了一遍,下面是对我的项目有影响的部分。
1. Generator Provider 变了
prisma
// 之前
generator client {
provider = "prisma-client-js"
}
// 之后
generator client {
provider = "prisma-client" // 注意没有 -js
output = "../src/generated/prisma-client" // output 字段现在是必填的
}
2. binaryTargets 被移除了
我之前为了兼容 Docker 里的 Alpine Linux 加了 binaryTargets = ["native", "linux-musl-openssl-3.0.x"]。Prisma 7 不再需要这个了,因为根本没有原生二进制文件了。
3. Database URL 迁移到 prisma.config.ts
这是最烦的一个变更。之前 DATABASE_URL 写在 schema 的 datasource 块里,现在要单独创建一个配置文件:
typescript
// prisma.config.ts(项目根目录)
import 'dotenv/config';
import { defineConfig, env } from 'prisma/config';
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
});
schema 里的 url = env("DATABASE_URL") 可以留着但会被废弃。
4. Driver Adapter 必须显式传入
Prisma 7 不再自动管理数据库连接了。你得显式创建一个 adapter 传给 PrismaClient:
typescript
// 之前
import { PrismaClient } from '@/generated/prisma-client';
const prisma = new PrismaClient();
// 之后
import { PrismaClient } from '@/generated/prisma-client/client';
import { PrismaMySQL } from '@prisma/adapter-mysql';
const adapter = new PrismaMySQL({
url: process.env.DATABASE_URL,
});
const prisma = new PrismaClient({ adapter });
MySQL 需要装 @prisma/adapter-mysql 和 mysql2。
5. Import 路径全变了
所有 from '@/generated/prisma-client' 要改成 from '@/generated/prisma-client/client'。我项目里大约 20 个文件需要改,可以用 find + sed 批量处理。
6. 环境变量不再自动加载
Prisma CLI 不再自动读 .env 文件了。虽然 Next.js 本身会加载 dotenv,但 prisma.config.ts 里需要手动 import 'dotenv/config'。好在我的项目已经开启了 "type": "module",影响不大。
对我项目的影响评估
| 维度 | 评估 |
|---|---|
| 性能提升 | 查询快 1.5-2 倍,冷启动更快 |
| 包体积 | 14MB → 1.6MB,Docker 镜像更小 |
| 代码改动 | ~20 个文件 import + 1 个实例化 + schema/config |
$use 迁移 |
不需要,没用过 |
$queryRaw 迁移 |
不需要,没用过 |
| 风险点 | MySQL adapter 成熟度中等,社区用 PostgreSQL 的多 |
| 预计耗时 | 30 分钟改代码 + 30 分钟测试 = 约 1 小时 |
完整升级步骤
Phase 1: 备份
bash
# git 分支
git checkout -b upgrade/prisma-7
# 数据库备份
mysqldump -u root -p blog > /tmp/blog-backup-$(date +%Y%m%d).sql
Phase 2: 更新依赖
bash
# 升级核心
pnpm add @prisma/client@7
pnpm add -D prisma@7
# MySQL adapter
pnpm add @prisma/adapter-mysql mysql2
Phase 3: 改 Schema
diff
generator client {
- provider = "prisma-client-js"
- output = "../src/generated/prisma-client"
- binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
+ provider = "prisma-client"
+ output = "../src/generated/prisma-client"
}
datasource db {
provider = "mysql"
- url = env("DATABASE_URL")
}
Phase 4: 创建 prisma.config.ts
typescript
import 'dotenv/config';
import { defineConfig, env } from 'prisma/config';
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
});
Phase 5: 改 PrismaClient 实例化
src/lib/prisma.ts 这个文件改动最大:
typescript
import { PrismaClient } from '@/generated/prisma-client/client';
import { PrismaMySQL } from '@prisma/adapter-mysql';
const adapter = new PrismaMySQL({
url: process.env.DATABASE_URL,
});
declare global {
var prisma: PrismaClient | undefined;
}
export const prisma =
global.prisma ||
new PrismaClient({
adapter,
log: process.env.PRISMA_HIDE_QUERY_LOG === 'true'
? ['error', 'warn']
: process.env.NODE_ENV === 'development'
? ['query', 'error', 'warn']
: ['error'],
});
if (process.env.NODE_ENV !== 'production') {
global.prisma = prisma;
}
Phase 6: 批量替换 Import
bash
find src/ -name '*.ts' -o -name '*.tsx' | xargs sed -i \
's|from.*@/generated/prisma-client|from "@/generated/prisma-client/client"|g'
注意要排除 src/generated/ 本身的文件,别把生成的代码也改了。
Phase 7: 清理 package.json
移除 @prisma/engines 依赖(如果有的话),这个包在 v7 不再需要。
Phase 8: Dockerfile 适配
mysql2 有 native 依赖,在 Alpine 里需要编译工具:
dockerfile
RUN apk add --no-cache python3 make g++
Phase 9: 生成与验证
bash
npx prisma generate
pnpm build
pnpm dev
# 跑一遍各个 API,确认数据库操作正常
什么时候升
我的建议是不急但要做。Prisma 6 还会维护一段时间,不会突然不能用。但 v6 不会有新特性了,越拖越难升。
计划是:
- 本周:在本地开分支跑一遍,验证 API 正常
- 确认 MySQL adapter 稳定后:合入 main,随下次功能发布一起上线
- Docker 镜像减小这个收益对 VPS 部署挺实在的
如果你也是 MySQL + Next.js 的技术栈,升级流程基本可以照搬。PostgreSQL 的话 adapter 更成熟,可以更放心地升。MongoDB 用户暂时别升,Prisma 7 还不支持。