Prisma
TypeScript / Node.js のための型安全な ORM。 宣言的なスキーマ → マイグレーション → 自動生成された型付き Client、までを 1 セットで提供する。
Prisma が解決する問題
- SQL を直書きすると型が手書きになる
- マイグレーションは管理が面倒(連番 / ロールバック)
- JOIN を含むクエリの結果型を TypeScript で正確に表現したい
- 複数 DB(Postgres / MySQL / SQLite / MongoDB)を共通 API で扱いたい
Prisma はschema.prisma という 1 ファイルから:
- マイグレーション SQL を生成して DB に適用
- 型付き Client を自動生成
- クエリ結果に正確な型を付ける
主要構成
schema.prisma ← 1 ファイルでスキーマを宣言
│
├──→ prisma migrate (DB に反映)
│
└──→ prisma generate
│
▼
@prisma/client (自動生成された型付き Client)
│
▼
アプリ ← 型推論された find/create/update/delete
対応 DB
| DB | サポート |
|---|---|
| PostgreSQL | 完全対応(推奨) |
| MySQL / MariaDB | 完全対応 |
| SQLite | 完全対応(学習・ローカル) |
| SQL Server | 対応 |
| CockroachDB | 対応 |
| MongoDB | 対応(一部機能制約) |
| PlanetScale / Neon / Supabase | Postgres / MySQL 互換で動く |
Prisma の現在地(2026 年時点)
- v6 系。Rust エンジン → TypeScript エンジンへの移行中(Prisma Postgres)
- Edge / Cloudflare Workers / Deno 対応強化
- Prisma Accelerate(公式コネクションプーラー + クエリキャッシュ)
- Prisma Postgres(公式マネージド Postgres)
- Drizzle / Kysely などの軽量 ORM が台頭する中、Prisma は型と DXで勝負
他の ORM / クエリビルダとの比較
| Prisma | Drizzle | TypeORM | Kysely | |
|---|---|---|---|---|
| API スタイル | 独自(findMany 等) | SQL に近い | Active Record / Data Mapper | SQL に近い |
| 型推論 | 強い | 強い | 普通 | 強い |
| マイグレーション | 純正 | drizzle-kit | 純正 | 外部 |
| サイズ | 大(Rust エンジン) | 軽量 | 大 | 軽量 |
| Edge 対応 | ○ Accelerate / driver adapters | ◎ ネイティブ | × | ◎ |
このセクションの読み方
- セットアップ — インストール、init、最初のクエリ
- schema.prisma — model / 型 / 属性
- マイグレーション — dev / deploy / push
- Prisma Client — CRUD と型推論
- リレーション — 1-1 / 1-N / N-N
- トランザクション — batch / interactive
- 高度な機能 — Raw SQL / extends / pooling
- 運用と注意点
クイックスタート
npm install -D prisma
npm install @prisma/client
npx prisma init --datasource-provider postgresql
// prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
createdAt DateTime @default(now())
}
npx prisma migrate dev --name init # DB に反映 + Client 生成
import { PrismaClient } from "@prisma/client"
const prisma = new PrismaClient()
const post = await prisma.post.create({
data: { title: "Hello" }
})
const posts = await prisma.post.findMany({
where: { published: true },
orderBy: { createdAt: "desc" },
take: 20,
})
向き / 不向き
向き: スキーマ駆動でしっかり管理したい / 型安全を最大化したい / Postgres 中心。 不向き: 軽量に動かしたい Edge / Cloudflare Workers のみ環境(Drizzle や Kysely の方が適合)。