记一次 Prisma 6 升级 7 的评估与升级指南

2026年07月03日2 次阅读0 人喜欢
PrismaNext.jsTypeScript踩坑记录数据库设计升级指南

博客的 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-mysqlmysql2

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 不会有新特性了,越拖越难升。

计划是:

  1. 本周:在本地开分支跑一遍,验证 API 正常
  2. 确认 MySQL adapter 稳定后:合入 main,随下次功能发布一起上线
  3. Docker 镜像减小这个收益对 VPS 部署挺实在的

如果你也是 MySQL + Next.js 的技术栈,升级流程基本可以照搬。PostgreSQL 的话 adapter 更成熟,可以更放心地升。MongoDB 用户暂时别升,Prisma 7 还不支持。

加载评论中...