Webアプリケーション開発では、ユーザー情報や投稿データなどをデータベースへ保存・取得する処理が欠かせません。SQLに不慣れだと、この操作を書くハードルが高く感じられることがあります。そこで近年のTypeScript・Next.js開発で広く使われているのが、SQL文を直接書かずにデータベースを操作できる「ORM(Object Relational Mapping)」というツールです。
本記事では、その中でも特に人気の高いPrismaを紹介します。PrismaはTypeScriptとの相性がよく、コードの補完や型チェックを活かしながらデータベースを扱えるため、データベース操作に不慣れな方や、Next.jsでDB連携を実装したい方に特におすすめです。Prismaの基本から、Next.jsへの導入方法、CRUD処理やマイグレーションといった具体的な使い方、近年人気のDrizzle ORMとの比較まで解説していきますので、ぜひ参考にしてみてください。
Prismaとは
Prismaの基本
Prismaは、Node.jsおよびTypeScript向けのORM(Object Relational Mapping)です。
ORMとは、データベースのテーブルやレコードを、プログラム上のオブジェクトのように扱えるようにする仕組みのことを言います。
通常、データの取得・登録・更新・削除といった操作はSQL文を書いて行いますが、ORMを使うと、こうした操作をTypeScriptのコードから扱いやすくなります。
SQLに不慣れな場合でも、データベース操作に取り組みやすくなる点がメリットです。
PrismaがTypeScript開発で使いやすい理由
Prismaの特徴の一つは、TypeScriptとの相性のよさです。
型補完が効くため、存在しないカラム名を指定したり、型の合わないデータを渡したりといったミスに、コードを書いている段階で気づきやすくなります。
これにより、実行してから初めてエラーに気づく、といった手戻りを減らしやすくなります。
また、Prismaでは「schema.prisma」という設定ファイルをもとに、データベースの構造やモデル(テーブルの定義)を一元的に管理します。
このスキーマを起点に、データを操作するための「Prisma Client」、データベースの変更履歴を管理する「Prisma Migrate」、データをGUIで確認・編集できる「Prisma Studio」といった機能が用意されており、開発から運用まで一貫して扱いやすいように設計されています。
こうした特徴から、Prismaは多くのNext.jsプロジェクトで採用されています。
Prismaの主な機能・特徴
Prismaには、データベース操作を効率化するための機能が複数用意されています。
| 機能・特徴 | 内容 |
|---|---|
| 型安全なデータベース操作 | TypeScriptの型補完が効き、カラム名の誤りや型の不一致に気づきやすい |
| 直感的なAPI | SQLを直接書かずに、データの取得・登録・更新・削除をコードから扱いやすい |
| スキーマ管理 | schema.prismaという設定ファイルで、データベース構造やモデルを一元管理できる |
| マイグレーション | Prisma Migrateにより、テーブル変更の履歴を管理しながら反映できる |
| 複数データベース対応 | PostgreSQL、MySQL、SQLiteなど複数のデータベースに対応している |
| Prisma Studio | データをブラウザ上のGUIで確認・編集できるツール |
これらの機能により、PrismaはTypeScriptやNext.jsを使ったWebアプリケーション開発で扱いやすいORMとして利用されています。
Prisma ormの初期設定:Next.js環境での導入とスキーマ定義
本記事で使用するバージョンについて
2026年9月時点で、Prisma ORMには複数のバージョン系統が存在しています。
7系は現在の正式な安定版で、本番環境でも推奨されているバージョンです。一方、次世代版として開発が進められている8系は、これまでの早期アクセス(Early Access)段階を経て、現在は正式版の直前段階にあたる「リリース候補(RC)」まで進んでいます。ただし、2026年9月時点ではまだ正式版(バージョン8.0.0)としては公開されておらず、Prismaの公式情報でも「本番環境では引き続き7系を推奨する」とされています。
注意したいのは、バージョンを指定せずにnpm install prismaを実行すると、2026年9月時点ではnpmのlatestタグが8系のリリース候補(RC)版を指しているため、意図せずv8がインストールされてしまう点です。v8はコマンドの挙動やファイル構成が7系と大きく異なるため、本記事のコード通りには動作しません。
そのため本記事では、正式な安定版であるPrisma 7系を使用します。8系はまだ正式リリース前の段階で、今後も仕様が変わる可能性があるため、初めてPrismaに触れる場合は、まず土台となる7系の使い方をひと通り押さえておくのがおすすめです。以降のインストールコマンドやコードは、すべて7系に統一しています。
Node.jsのバージョンを確認する
Prisma 7を利用するには、Node.jsが公式に対応している次のいずれかのバージョンである必要があります。
- 20.19以降
- 22.12以降
- 24.0以降
なお、Node.js 20系は2026年4月末でサポートが終了しているため、これから新しく環境を用意する場合は、現在の安定版(LTS)であるNode.js 24系を利用することをおすすめします。
インストール済みのバージョンは、以下のコマンドで確認できます。
node -vNode.jsのインストールがまだの場合は、そちらを先に済ませてから次に進んでください。
パッケージのインストールとschema.prismaの基本構造
Prismaのインストールは、以下のコマンドで実行可能です。バージョンを@7のように指定することで、7系の最新パッチバージョンがインストールされます。
- prisma … Prismaを操作するCLI(コマンドラインツール)
- @prisma/client … アプリケーションのコードからデータベースを操作するためのクライアント
- @prisma/adapter-pg … PostgreSQLに接続するためのドライバアダプタ(Prisma 7から必須)
- pg … Node.jsからPostgreSQLへ接続するための定番ライブラリ(node-postgres)
- dotenv … .envファイルの内容を読み込むためのライブラリ
npm install prisma@7 @prisma/client@7 @prisma/adapter-pg pg dotenvPrisma 7からは、PrismaClientがデータベースへ接続する際に、上記の@prisma/adapter-pgのような「ドライバアダプタ」を渡すことが必須になりました。以前のバージョンのようにアダプタなしで接続することはできないため、注意してください。
もう一つ、事前にpackage.jsonへ追加しておく設定があります。Prisma 7はCLIやPrisma Clientの生成コードがESM(ES Modules)という形式になっているため、package.jsonに以下の一行を追加してください。create-next-appで作成したばかりのプロジェクトには入っていない設定なので、手動で追加が必要です。
{
"type": "module"
}この設定がないまま進めると、このあと生成するprisma.config.tsの読み込みや、npx prisma generateの実行時にエラーが発生することがあります。
インストールが完了したら、続いて初期化コマンドを実行します。
npx prisma initコマンドを実行すると、以下のような構成でディレクトリとファイルが生成されます。
sample-app/
├── prisma/
│ └── schema.prisma
├── .env
├── prisma.config.ts
└── .gitignore
それぞれのファイルの役割は、次の通りです。
- schema.prisma … データベースの接続先やテーブル構造を定義する、Prismaの中心となる設定ファイル
- .env … データベースの接続情報(DATABASE_URL)などを保存しておく環境変数ファイル
- prisma.config.ts … マイグレーションの保存場所や.envの読み込みなど、Prisma CLIの動作をまとめて設定するファイル(Prisma 7から新しく追加されました)
- .gitignore … .envや自動生成されるファイルなど、Gitで管理する必要がないファイルをあらかじめ指定しておく設定ファイル
schema.prismaには、初期状態で以下のような内容が記述されています。
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
}以前のバージョンでは、generatorのproviderにprisma-client-jsを指定するのが標準でしたが、Prisma 7からはprisma-clientが標準になりました。あわせて、Prisma Clientの生成先を指定するoutputの記述が必須になっています。生成されたクライアントは、node_modulesの中ではなく、ここで指定したフォルダ(この例ではプロジェクト直下のgenerated/prismaフォルダ)に出力されます。
また、以前のバージョンではdatasourceブロックの中にurl = env("DATABASE_URL")という記述がありましたが、Prisma 7からは接続情報の指定先がprisma.config.tsに変わったため、schema.prisma側からは削除されています。
各ブロックの役割は次の通りです。
- generator … Prisma Clientの生成設定
- datasource … 接続先データベースの種類の設定
- model(この時点ではまだ未記述) … データベースのテーブル定義
あわせて生成された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.prismaから削除された接続情報(DATABASE_URL)は、このファイルのdatasource.urlで読み込まれています。
また、ファイル冒頭のimport "dotenv/config";によって、.envファイルの内容が読み込まれる仕組みになっています。Prisma 7からは.envファイルが自動では読み込まれなくなったため、この一行が必要になりました。npx prisma initで生成された時点ですでに記述されているため、自分で追加する必要はありません。
ローカルの検証用データベースを準備する
Prismaを実際に動かすには、接続先となるデータベースが必要です。とはいえ、初めてPrismaに触れる段階で、PostgreSQLを自分のパソコンにインストールしたり、外部サービスに登録してデータベースを用意したりするのはハードルが高く感じられるかもしれません。
そこで本記事では、Prisma自身が提供しているnpx prisma devコマンドを使用します。これは、パソコンの中だけで完結するPostgreSQL互換のデータベースをその場で起動してくれるコマンドで、別途PostgreSQLやDockerをインストールしたり、アカウント登録をしたりする必要がありません。
ターミナルをもう一つ開き(以降、Next.jsの開発サーバーを起動するターミナルとは別に使用します)、プロジェクトのディレクトリで以下のコマンドを実行してください。
npx prisma dev実行すると、ローカルのデータベースが起動し、ターミナル上に接続用のDATABASE_URLが表示されます。以下は表示例です(実際のポート番号などは環境によって異なります)。
DATABASE_URL="postgresql://postgres:postgres@localhost:51214/template1"このコマンドを実行したターミナルは、作業中は閉じずにそのまま起動させておいてください。以降のコマンドは、別のターミナルで実行します。
.envファイルに接続情報を設定する
データベースの接続情報は、コードに直接書き込むのではなく、.envファイルに環境変数として記述するのが基本です。先ほどnpx prisma devを実行した際に表示されたDATABASE_URLを、生成された.envファイルへ貼り付けてください。
DATABASE_URL="postgresql://postgres:postgres@localhost:51214/template1"接続情報を.envファイルに切り出しておくことで、開発環境と本番環境で異なるデータベースへ安全に切り替えることができます。
なお、MySQLを使用する場合は、以下のような形式でDATABASE_URLを指定します(この場合、schema.prismaのdatasource.providerも"mysql"へ変更する必要があります)。本記事のこのあとの手順は、先ほど用意したPostgreSQL環境を前提に進めます。
DATABASE_URL="mysql://user:password@localhost:3306/sampledb"環境変数の読み込みについては、もう一点補足しておきます。prisma.config.tsにはすでにimport "dotenv/config";が記述されているため、npx prisma migrate devなどのCLIコマンドを実行する際は自動的に.envの内容が読み込まれます。また、Next.jsのRoute HandlersやServer Actionsの中でprocess.env.DATABASE_URLを参照する場合も、Next.js自体が.envファイルを自動的に読み込むため、dotenvを別途読み込む必要はありません(Next.jsを介さずに自分で用意したスクリプトを直接実行する場合は、この読み込みが働かないため、スクリプト側にも同じ一行が必要です)。
スキーマにモデルを定義する
接続先の準備ができたら、schema.prismaにデータベースのテーブルにあたる「モデル」を定義します。以下のように、Userモデルを追加してください。
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
}マイグレーションを実行してテーブルを作成する
schema.prismaにモデルを追加しただけでは、まだデータベースにテーブルは作成されていません。以下のコマンドを実行し、実際にテーブルを作成します。
npx prisma migrate dev --name init続いて、以下のコマンドでPrisma Clientを生成します。
npx prisma generate以前のバージョンでは、migrate devを実行すると自動的にPrisma Clientの生成まで行われていましたが、Prisma 7からはこの自動生成が行われなくなりました。schema.prismaを変更してデータベースに反映させたあとは、npx prisma generateを忘れずに実行するようにしてください。マイグレーションの仕組みについては、後ほど「prisma migrateを用いた安全なマイグレーション管理」で詳しく説明します。
【実践】Next.jsでデータベースを操作するCRUDの具体例
PrismaClientの初期設定とシングルトンパターンによる多重接続防止
PrismaClientはホットリロードの度に新しいインスタンスを生成するため、無駄な接続を増やさないためにシングルトン化することが推奨されています。
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "../generated/prisma/client";
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined;
};
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
});
export const prisma =
globalForPrisma.prisma ??
new PrismaClient({ adapter });
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}importの参照先が、これまでの@prisma/clientから、generatorのoutputで指定した生成先(../generated/prisma/client)に変わっている点に注意してください。あわせて、先ほどインストールした@prisma/adapter-pgを使ってPostgreSQLへの接続(アダプタ)を作成し、new PrismaClient()へ渡しています。schema.prismaのgenerator・output、Prisma Clientの生成、importの参照先が一貫している必要がある点がポイントです。
これにより、不要な接続増加を防ぐことができます。開発中に実行されているSQLを確認したい場合は、new PrismaClient({ adapter, log: ["query"] })のようにlogオプションを追加すると、実行されたクエリがターミナルに出力されるようになります。
補足として、Vercel Edge FunctionsやEdge Middlewareのように、通常のNode.js実行環境とは異なる場所(Edge Runtime)でPrismaを使う場合は注意が必要です。本記事で使用している@prisma/adapter-pg(pgパッケージ)はNode.jsの機能に依存しているため、Edge Runtime上ではそのまま動作しません。Edge Runtimeで利用したい場合は、Neonなど対応するデータベースサービス向けの別のドライバアダプタが必要になります。通常のNode.js環境で動作するRoute HandlersやServer Actionsで使う分には、本記事の内容のままで問題ありません。
Server ActionsやRoute Handlersでのデータ取得・保存コード例
データ操作に関するコードをいくつか紹介します。
データ取得(Read):
const users = await prisma.user.findMany();データ登録(Create):
await prisma.user.create({
data: {
name: "Taro",
email: "taro@example.com",
},
});データ更新(Update):
await prisma.user.update({
where: {
id: 1,
},
data: {
name: "Jiro",
},
});データ削除(Delete):
await prisma.user.delete({
where: {
id: 1,
},
});以下は、Route Handlerで利用する例です。
import { prisma } from "@/lib/prisma";
export async function GET() {
try {
const users = await prisma.user.findMany();
return Response.json(users);
} catch (error) {
console.error(error);
return Response.json(
{ error: "データベースの取得に失敗しました" },
{ status: 500 }
);
}
}データベースへの接続に失敗した場合など、prismaの呼び出しはエラーを投げることがあります。try/catchで囲んでおくことで、エラー発生時にアプリケーション全体が落ちてしまうのを防ぎ、意図したエラーレスポンスを返せるようになります。
このように、少ないコード量でCRUDを実装できます。
Prisma dbコマンドの活用:db pushとdb pullによる効率的な開発
プロトタイプ開発を加速させるprisma db pushの使い方
スキーマ変更を即座にデータベースに反映したい場合は、db pushを使用します。
npx prisma db pushコマンドを実行すると、schema.prismaの内容がそのままデータベースへ適用されます。
特徴:
・即座にデータベースに反映
・マイグレーションファイル(変更履歴)を生成しない
・個人開発や検証環境向け
例えば、先ほど作成したUserモデルへageカラムを追加した後、db pushを実行するだけで反映されます。
model User {
id Int @id @default(autoincrement())
name String
email String @unique
age Int?
}カラムを追加するだけのこの例のように、既存のデータに影響しない変更であれば、db pushはそのまま反映されます。反映が終わったら、忘れずにnpx prisma generateを実行し、Prisma Clientをこの新しいカラムに対応させておきましょう。
一方で、注意したいのが「破壊的変更の可能性がある」と説明されている点です。これは、例えばすでにデータが入っているカラムを削除したり、互換性のない型に変更したりするようなスキーマの変更を指します。
このようなデータが失われる可能性のある変更をdb pushしようとすると、Prismaは変更を勝手には適用せず、以下のような警告を表示してくれます。
Do you want to ignore the warning(s)?
y - yes
n - noここでn(または何も操作せずにコマンドを終了)を選べば、データベースには何も反映されず、データもそのまま残ります。反対に、CIなどy/nの入力ができない環境で変更を強制的に反映したい場合は、npx prisma db push --accept-data-lossのように–accept-data-lossオプションを付けて実行します。ただし、このオプションを付けた場合は警告なしにデータが削除されるため、個人の検証環境以外では使用しないよう注意してください。
既存のデータベース構造をスキーマへ逆生成するprisma db pullの役割
既存のデータベースからスキーマを生成する場合は、db pullを利用します。
npx prisma db pullコマンドを実行すると、データベースの構造を解析してschema.prismaに反映させます。
既存システムへPrismaを導入する際に便利です。
【運用】prisma migrateを用いた安全なマイグレーション管理
チーム開発で変更履歴をSQLとして残すmigrate devの仕組み
本格的な開発では、マイグレーション管理が重要となります。
先ほど初期設定の中で実行したのも、実はこのmigrate devコマンドです。開発時は、スキーマを変更するたびに以下のコマンドを実行します。
npx prisma migrate dev --name <マイグレーション名>実行すると、以下のような構成で SQLファイルが生成されます。
prisma/
└── migrations/
└── [日付]_[マイグレーション名]
└── migration.sql
マイグレーションを行うと、migrationsディレクトリ配下で変更履歴を管理できるだけでなく、ファイルを Git管理することも可能です。
また、構造の再現が容易となるため、特にチーム開発では重要な機能となります。
なお、db pushの項目でも触れた通り、Prisma 7ではmigrate devを実行してもPrisma Clientは自動生成されません。スキーマを変更してmigrate devを実行したあとは、忘れずにnpx prisma generateも実行してください。
本番環境のデータベースへ安全に変更を適用するmigrate deployの手順
本番環境でマイグレーションを実行する場合は、以下のコマンドを使用します。
npx prisma migrate deploy上記コマンドではSQLファイルの新規生成は行わず、未適用の既存ファイルのみマイグレーションを実行します。
一般的な使用の流れは、以下の通りです。
- 開発環境でmigrate dev
- Gitへコミット
- 本番環境へデプロイ
- migrate deploy実行
これにより、開発環境と本番環境の差異を防げます。
ここで一つ知っておきたいのが、migrate deployの実行中にエラーが発生しても、Prismaが自動的に変更を元に戻す(ロールバックする)わけではないという点です。エラーが起きたマイグレーションは「失敗した状態」としてPrisma側に記録されるため、原因を修正しないまま次のmigrate deployを実行しようとすると、そこでも失敗してしまいます。
このような場合は、まずデータベースの状態を確認したうえで、実際にはそのマイグレーションの変更が反映されなかったのであれば、
npx prisma migrate resolve --rolled-back <マイグレーション名>を、手動での修正などによって変更が反映済みであれば、
npx prisma migrate resolve --applied <マイグレーション名>を実行します。これにより、Prisma側が記録しているマイグレーションの状態を、データベースの実際の状態に合わせてから、改めてmigrate deployを実行できるようになります。migrate resolveは失敗したマイグレーションに対してのみ使用できるコマンドですが、本番運用でトラブルが起きた際に知っておくと安心です。
Prismaとライバル「Drizzle ORM」の比較から考える選定基準
スキーマ定義の記述アプローチと型安全性の思想の違い
近年では、Prismaの他に Drizzle ORMも人気が高くなっています。
両者の特徴的な違いの1つは、スキーマ定義の記述方法にあります。
Prismaのスキーマ定義は、ドメイン特化言語(DSL) で行います。
model User {
id Int @id
name String
}Prismaの型安全性は強力で、スキーマを元に自動で生成されるTypeScriptの型定義ファイルを利用し、クエリを記述する際にTypeScriptのコンパイラが型チェックを行います。
これにより、正確な型推論やエラー検知を可能としています。
一方、Drizzleは TypeScriptで直接スキーマ定義をします。
export const users = pgTable("users", {
id: serial("id").primaryKey(),
name: text("name"),
});Prismaのような生成ステップが必要なく、TypeScriptの型推論を利用するため、リアルタイムで型生成が行われるのが特徴です。
スキーマの反映速度においては、Drizzleの方にやや軍配が上がります。
プロジェクトの規模やパフォーマンス要件に応じた技術選定のポイント
PrismaとDrizzleの全体的な特徴は、それぞれ以下が挙げられます。
Prisma:
・学習コストが低い
・ドキュメントが豊富
・DX重視
Drizzle
・TypeScriptとの一体感が強い
・軽量
・SQLに近い設計
Prismaは DSLの導入により、SQL操作に慣れていないユーザーでも記述しやすく、簡潔なコードを可能としています。
Drizzleは反対に、SQLに近い操作を可能とするため、複雑なクエリの調整も行いやすい傾向にあります。
開発環境などに合わせた選定は、以下を基準にすると行いやすいでしょう。
Prismaが向くケース:
・SQL経験者が少ない
・チーム開発などでマイグレーション管理が重要である
・開発効率を重視したい
Drizzleが向くケース:
・SQLを積極的に活用したい
・パフォーマンスやバンドルサイズを重視したい
・ORMの抽象化を最小限にしたい
まとめ
PrismaはTypeScriptとの相性が非常に良く、型安全なデータベース操作を実現できるモダンなORMです。
Web開発における生産性と保守性を大きく向上させるため、これからORMを学ぶ開発者にとって最有力候補の一つと言えるでしょう。
なお、本記事では2026年9月時点の正式な安定版であるPrisma 7系をもとに解説しています。次世代版であるPrisma 8系はリリース候補(RC)の段階まで進んでおり、正式版が公開されると本記事の内容とは異なる部分が出てくる可能性があります。実際に導入する際は、公式ドキュメントで最新の情報もあわせて確認するようにしてください。