Next.js App Routerに最適なORMを徹底比較:Prisma / Drizzle / Kysely / TypeORMの選び方ガイド【前編】
はじめに
Next.jsのApp Routerは、これまでのPages Routerと比べてルーティング・データ取得・サーバー処理の構成が大きく変わりつつあります。中でも「データベースとの接続をどこでどう扱うか」は、アプリの構造や開発体験を左右する重要な選定ポイントです。
その選定の中心にあるのが、**ORM(Object-Relational Mapping)**です。
Prisma、Drizzle ORM、Kysely、TypeORM といった選択肢がある中で、App Routerの構造と本当に相性が良いORMはどれなのか?
この記事では、実装のしやすさ・型安全性・運用性・ホスティング対応といった観点から、実際のコードも交えて徹底比較していきます。
この記事について
この記事は 「Next.js × ORM 比較」シリーズの前編です。
前編(本記事)では、App Routerと相性の良いORMを選定するための比較軸を整理し、各ORMの特徴や違いを解説します。
後編(次回)では、DockerでPostgreSQL/MySQL環境を構築し、各ORMを実際に導入・マイグレーション・API実装する実践編をお届けします。
✅ 本記事で扱うこと
- Next.js(App Router)環境での ORM 選定
- Prisma / Drizzle ORM / Kysely / TypeORM の特徴と比較
- Supabase(PostgreSQL)や PlanetScale(MySQL)といったマネージドDBとの相性
- 型安全性、マイグレーション、軽量さ、Edge対応などの評価軸
🚫 この記事で扱わないこと
- GraphQLを前提としたORM利用(Hasura / PostGraphileなど)
- ORM未使用の生SQL、Knex単体での活用
- Pages Router(従来のNext.js構成)でのORM利用
比較の背景
Next.js App Routerでは、ルートハンドラ(app/api/*/route.ts)やServer Actionsを用いて、Reactのコンポーネントとバックエンドの境界がより曖昧かつ柔軟になりました。
このアーキテクチャでは、以下のようなことが頻繁に起こります:
- サーバーサイドで直接DBを叩きたい
- UIコンポーネント内からServer Action経由でデータ取得したい
- Edge Functionsで処理したいが、Clientのサイズやコネクション数が気になる
こうした背景の中で、単に「使えるORM」ではなく「Next.js App Routerと実際に噛み合うORM」を選ぶことが求められています。
本記事では、そうしたニーズに応えるべく、App Routerでの実用を前提としたORM比較と、環境ごとの注意点(特にSupabase / PlanetScale)まで踏み込んで解説していきます。
各ORM紹介:Next.js App Routerでよく使われる4つの選択肢
本記事では、Next.js App Routerと組み合わせて使われることの多い以下の4つのORMを比較対象とします。
| ORM | 対応DB | 特徴 |
|---|---|---|
| Prisma | PostgreSQL, MySQL, SQLite など | 型安全・ドキュメント豊富・GUI管理ツール付き。スキーマ駆動で高速開発に向く。 |
| Drizzle ORM | PostgreSQL, MySQL, SQLite | SQLに近い構文で軽量。App RouterやEdge Functionと相性が良く、注目度上昇中。 |
| Kysely | PostgreSQL, MySQL, SQLite | SQLライクなDSLと高い型推論能力が魅力。自由度の高さと軽量さが特徴。 |
| TypeORM | PostgreSQL, MySQL, SQLite | DecoratorベースのEntity定義。NestJSでの採用が多く、古参だがApp Routerには非対応点も。 |
これらはすべて、Next.js App Routerにおいて以下のような用途で使用されることを想定しています。
- API Route(
app/api/*/route.ts)でのデータ取得や登録 - サーバーアクション内でのデータ操作
- 必要に応じてEdge Functionで動かす構成(特にDrizzle / Kysely)
比較軸:Next.js App RouterでORMを選ぶときに見るべきポイント
ORMの比較といっても、単に「使いやすさ」や「人気」で選ぶだけでは足りません。
特にApp Router時代のNext.jsでは、以下のような観点で選定することが重要です。
型安全性(Type Safety)
- スキーマ定義から型を自動生成できるか
- クエリ時の型推論がどこまで精度高く働くか
| ORM | 型安全性 |
|---|---|
| Prisma | ◎ |
| Drizzle ORM | ◎ |
| Kysely | ◎ |
| TypeORM | △ |
補足
- Prisma:スキーマ駆動の型生成が可能。モデル・クエリ両方で型安全性が高い。
- Drizzle:SQL DSLを使いながらも、テーブル構造をベースにした完全型安全を実現。
- Kysely:SQL文風ながら、構文に依存しない柔軟な型推論が非常に強力。複雑なJOINでも型が崩れにくい。
- TypeORM:Entity定義とクエリ構文の整合が取りにくく、型と実行時のズレが発生しやすい。
Edge Functionとの相性(軽量さ・クライアントサイズ)
- Vercelなどのホスティング環境でEdge Functionを使いたい場合、クライアントサイズやコネクション制限に注意が必要
| ORM | Edge対応 |
|---|---|
| Prisma | △ |
| Drizzle ORM | ◎ |
| Kysely | ◎ |
| TypeORM | × |
補足
- Prisma はクライアントサイズが大きく、Edge Function 非推奨。
- Drizzle / Kysely は非常に軽量で、Vercel の Edge Runtime にも適している。
- TypeORM はNode依存が強く、Edge環境では実質不可。
Migration対応とDB管理
- スキーマ変更をどう反映するか
- CLIツールの使いやすさ、DBとの整合性
| ORM | Migration管理 |
|---|---|
| Prisma | ◎ |
| Drizzle ORM | ○ |
| Kysely | △ |
| TypeORM | △ |
補足
- Prisma:prisma migrate / db push による管理が簡単で、実運用向け。
- Drizzle:drizzle-kit でスキーマからDDLを生成可能。運用にも強い。
- Kysely:公式のMigrationはやや扱いづらい。別ライブラリや手動管理が必要。
- TypeORM:CLIでMigration生成可能だが、精度や制御性がやや弱い。
Next.js App Routerでの実装しやすさ
- API Routeやサーバーアクションで自然に使えるか
- 接続管理、初期化処理、型定義の扱いやすさ
| ORM | 実装しやすさ |
|---|---|
| Prisma | ◎ |
| Drizzle ORM | ◎ |
| Kysely | ○ |
| TypeORM | △ |
補足
- Prisma / Drizzle は import と初期化が簡潔で、App Routerとの統合も自然。
- Kysely は型定義の準備に少し手間があるが柔軟性が高い。
- TypeORM はDI風の構成が必要で、APIルートやServer Actionsで扱うには工夫が必要。
Supabase / PlanetScaleとの相性(詳細は後述)
| ORM | Supabaseとの相性 | PlanetScaleとの相性 |
|---|---|---|
| Prisma | ◎ | △ |
| Drizzle ORM | ◎ | ◎ |
| Kysely | ◎ | ◎ |
| TypeORM | ○ | △ |
補足
- PrismaはSupabaseに強いが、PlanetScaleでは制限あり
- DrizzleやKyselyは両方と好相性
- TypeORMは両者と微妙(特にPlanetScaleで要注意)
以上の比較軸をベースに、次のセクションでは「実際に同じデータ取得処理を各ORMでどう書くか」を比較していきます。実装時の書き心地や見通しやすさもあわせて見ていきましょう。
まとめと次回予告
この記事では、Next.js App Router におけるORM選定の観点から、以下の4つの主要なORM(Prisma / Drizzle ORM / Kysely / TypeORM)を、型安全性、マイグレーション、Edge対応、マネージドDBとの相性といった軸で比較してきました。
それぞれのORMには明確な個性と選定基準があることが見えてきたのではないでしょうか。
次回の記事では、実際にDockerでPostgreSQLとMySQLを立ち上げた環境で、各ORMを順に導入・マイグレーション・API構築まで行う実践編をお届けします。
- PrismaでマイグレーションしてAPIを作るには?
- Drizzleでテーブル定義からスキーマを作るには?
- Kyselyで同じことをどう表現するか?
- それぞれの書き心地や設計のクセは?
といった内容を、実装ベースで比較していく予定です。
「言語化しづらい開発体験の違い」まで踏み込みながら、どのORMが自分たちのプロジェクトに合うかを、よりリアルに判断できる材料にしていただけたらと思います。
👉 後編はこちら:
関連する技術ブログ
Webアプリのセキュリティ強化ガイド:CSRF・XSS・SQL Injection 対策からログ管理まで
2023/05/01チャットアプリ(画像・PDF送信、ビデオ通話機能付き)
2024/07/15管理ダッシュボード機能(グラフ表示、データ取り込み)
2024/06/02NestJSで記事投稿APIを作ろう ─ Prisma導入とCRUD実装の基本
2025/04/12NestJSアプリの信頼性を高める ─ ログ・エラーハンドリング・テスト戦略
2024/09/11NestJS × Prismaで深めるDB設計 ─ モデル・リレーション・運用設計
2024/09/12NestJS × React × Railway:ブログUIを実装して本番環境へデプロイ
2024/10/25Next.jsとAuth.jsで認証機能を実装するチュートリアル
2024/09/13