これは、筆者の「2025振り返り用ひとりアドカレ」記事の一つです。
はじめに
本記事では、Prisma が用意したアップグレード手順ページに沿って進めてもうまくいかなった方向けに解決策を提示したいと思います。
というのも、筆者自身が(自身の知識や経験不足もあるでしょうが)アップグレードを進める中でドキュメント通りに進めると詰まった経験から記事にしておこうと思った次第です。
筆者のケースにおける解決策であり、汎用的なものかどうかは検証できていないので保証しかねます。ご了承ください。
筆者のケース・環境
Next.js v16 を使っています。
- @eslint/eslintrc@3.3.3
- @prisma/adapter-pg@7.1.0
- @prisma/client@7.1.0
- @types/node@24.10.1
- @types/react-dom@19.2.3
- @types/react@19.2.7
- @types/uuid@10.0.0
- dotenv@17.2.3
- eslint-config-next@16.0.7
- eslint@9.39.1
- jotai@2.15.2
- next@16.0.7
- pg@8.16.3
- prisma@7.1.0
- react-dom@19.2.1
- react@19.2.1
- typescript@5.9.3
- uuid@13.0.0
- 筆者は
postgreSQL,SQLiteで検証したため以下の差分があります
- @prisma/adapter-pg@7.1.0
+ @prisma/adapter-pg@7.1.0
+ @prisma/adapter-better-sqlite3@7.1.0 (SQLite使用時)
- @prisma/client@7.1.0
+ better-sqlite3@^11.0.0 (SQLite使用時)
+ pg@8.16.3 (PostgreSQL使用時)
-
OS
OSに関しては、そこまで影響がないものと思いますが筆者は Windows 11 です。 -
デプロイ・ホスティング先
Vercel -
データベース
Neon(postgreSQL),SQLite
※Neon は、Vercelと連携しているDB(postgreSQL)です。話が逸れるので割愛しますが無料枠もあってコスパ良しなサービスです。
アップグレード時のver遷移経緯
今回、prisma, prisma/client双方とも「6.19.0 -> 7.1.0にアップグレード」しました。
これは、7.1.0 までのverでは prisma が依存しているhonoが脆弱性のあるverを使っていたためです。hono起因の脆弱性エラーが通知されてfixすると 6.19.0 に差し戻される現象が続いていたので7.1.0でのアップグレードになりました。
結論
アップグレードガイドは非常に丁寧で、ステップバイステップで説明してくれています。
途中までは問題なく進むのですがいくつかのファイルでガイド通りにしても筆者はうまくいきませんでした。
また、各データベースに対応したドライバーアダプターをインストールする必要があります。
そこで先に、筆者がうまくいった各種設定ファイルを列挙していきます。
./prisma.config.ts
READMEなどと同じくプロジェクト直下に配置します。
-
prisma.config.tsとは
v7では、これまでschema.prismaやpackage.jsonで行っていた設定をprisma.config.tsというファイルで一元管理する仕組みに変更されました
postgreSQL版
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')
},
})
アップグレードガイドでの記述
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
shadowDatabaseUrl: env('SHADOW_DATABASE_URL')
},
})
schemaやmigrationsプロパティがありません。
SQLite版
import 'dotenv/config'
import { defineConfig } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: 'file:./dev.db'
},
})
アップグレードガイドでの記述
import { PrismaClient } from './generated/prisma/client';
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL || 'file:./dev.db'
})
export const prisma = new PrismaClient({ adapter })
こちらもschemaやmigrationsプロパティがありません。というか、もはや全く違う記述って感じです。
アップグレードガイドで記述されていたPrismaBetterSqlite3というSQLite用のアダプターですが、全く不要かと言うとそうではなく次のprisma.tsで使用します。
src/lib/prisma.ts
postgreSQL版
postgreSQLでは、PrismaPgというアダプターを使います。
import { PrismaClient } from '@/generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined
}
const createPrismaClient = () => {
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL!
})
return new PrismaClient({
adapter,
log: process.env.NODE_ENV === 'development'
? ['query', 'error', 'warn']
: ['error']
})
}
const prisma = globalForPrisma.prisma ?? createPrismaClient()
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
export default prisma
アップグレードガイドでの記述
import { PrismaClient } from './generated/prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL
});
const prisma = new PrismaClient({ adapter });
SQLite版
SQLiteでは、PrismaBetterSqlite3というアダプターを使います。
import { PrismaClient } from '@/generated/client'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined
}
const createPrismaClient = () => {
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL || 'file:./dev.db'
})
return new PrismaClient({
adapter,
log: process.env.NODE_ENV === 'development'
? ['query', 'error', 'warn']
: ['error']
})
}
const prisma = globalForPrisma.prisma ?? createPrismaClient()
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
export default prisma
アップグレードガイドでの記述
先ほど掲載したのと同じ内容です。というのも、アップグレードガイドではprisma.config.tsでの設定のまま話が進んでいくので (筆者のように雰囲気で読み進めると見逃します) 分かりづらい部分があります。
import { PrismaClient } from './generated/prisma/client';
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL || 'file:./dev.db'
})
export const prisma = new PrismaClient({ adapter })
./tsconfig.json
postgreSQL, SQLite双方で同じです。
アップグレードガイドでは以下のように記述されています。
"moduleResolution": "node"という記述になっていますが、ここを"moduleResolution": "bundler"にしないとビルド時につまづきます。
{
"compilerOptions": {
"module": "ESNext",
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"target": "ES2023",
"strict": true,
"esModuleInterop": true
}
}
というか、"moduleResolution": "node"は現在少し古めの設定なようですね。
こちらの記事がとても丁寧に説明してくださっています。
nodeは、TypeScript 7から設定として削除されるようです。
prisma/schema.prisma
こちらも双方ともに同様です。アップグレードガイドでは以下のように記述されています。
この設定で進めても問題ないのですが、コマンドラインに通知された設定記述がアップグレードガイドのそれと異なっていたことに筆者は少し驚きました。
そもそも、アップグレードガイドのnpx prisma generateの実施工程を見逃した筆者が悪いのですが、その結果、試行錯誤することになったのです。
その中で、コマンドラインに通知されたガイド設定が以下記述のようにアップグレードガイドのそれと異なっていました。
generator client {
provider = "prisma-client"
output = "../src/generated"
}
「もしや、これは Prisma 側がフレームワークをNextだと検知して良しなに推奨記述を変えてくれたのかも?」とか筆者は思うようにしました。
しかしアップグレードガイドと異なる記述がコマンドラインに表示されたので戸惑いました。
SQLiteで必要だった手順
postgreSQLではここでの作業は不要で、GitHubにpushしてマージすればCIが走って無事にデプロイ完了しました。
ただし、tsconfig.jsonの設定を正しく記述していないと落ちます。
SQLiteでは、以下のマイグレーション作業が必要でした。
1. Prisma migration を実行してテーブルを作成
npx prisma migrate dev --name init
2. または、マイグレーションを実行せずに同期だけさせる
npx prisma db push
3. Prisma Clientを再生成
npx prisma generate
これでSQLiteでも無事表示および機能するようになりました。
アップグレード作業時において
別にしなくても良いですが、筆者はことあるごとにnpx prisma generateを実行して生成されるかどうかをチェックしていました。
これによって、prisma側の問題か、それともアップグレード手順においてプロジェクト側(例:node_modules)で問題が発生したのか切り分けしたかったためです。
さいごに
Next.jsをv16にアップグレードする際はcodemodがあってすごく便利でした。
ああいったものを用意してくれるのはありがたいことなんだなぁと漠然と実感した次第です。
とはいえ、使わせてもらっている身なので贅沢は言えません。
今回の記事が少しでも役に立つと幸いです。
ここまで読んでいただき、ありがとうございました。
参照

