0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prisma v7 のアップグレードガイド通りに進めて詰まった方へ

Last updated at Posted at 2025-12-05

これは、筆者の「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

  • データベース
    NeonpostgreSQL), 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.prismapackage.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')
  },
})

schemamigrationsプロパティがありません。

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 })

こちらもschemamigrationsプロパティがありません。というか、もはや全く違う記述って感じです。

アップグレードガイドで記述されていた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双方で同じです。

アップグレードガイドでは以下のように記述されています。

スクリーンショット 2025-12-05 225033.png

"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

こちらも双方ともに同様です。アップグレードガイドでは以下のように記述されています。

スクリーンショット 2025-12-05 225944.png

この設定で進めても問題ないのですが、コマンドラインに通知された設定記述がアップグレードガイドのそれと異なっていたことに筆者は少し驚きました。

そもそも、アップグレードガイドの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があってすごく便利でした。
ああいったものを用意してくれるのはありがたいことなんだなぁと漠然と実感した次第です。

とはいえ、使わせてもらっている身なので贅沢は言えません。
今回の記事が少しでも役に立つと幸いです。

ここまで読んでいただき、ありがとうございました。

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?