Prisma

TypeScript / Node.js のための型安全な ORM。 宣言的なスキーマ → マイグレーション → 自動生成された型付き Client、までを 1 セットで提供する。

Prisma が解決する問題

Prisma はschema.prisma という 1 ファイルから:

  1. マイグレーション SQL を生成して DB に適用
  2. 型付き Client を自動生成
  3. クエリ結果に正確な型を付ける

主要構成

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 / SupabasePostgres / MySQL 互換で動く

Prisma の現在地(2026 年時点)

他の ORM / クエリビルダとの比較

PrismaDrizzleTypeORMKysely
API スタイル独自(findMany 等)SQL に近いActive Record / Data MapperSQL に近い
型推論強い強い普通強い
マイグレーション純正drizzle-kit純正外部
サイズ大(Rust エンジン)軽量軽量
Edge 対応○ Accelerate / driver adapters◎ ネイティブ×

このセクションの読み方

  1. セットアップ — インストール、init、最初のクエリ
  2. schema.prisma — model / 型 / 属性
  3. マイグレーション — dev / deploy / push
  4. Prisma Client — CRUD と型推論
  5. リレーション — 1-1 / 1-N / N-N
  6. トランザクション — batch / interactive
  7. 高度な機能 — Raw SQL / extends / pooling
  8. 運用と注意点

クイックスタート

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 の方が適合)。