はじめに
TypeScriptのORMといえば Prisma が定番ですが、最近やたらと名前を見かけるORMがあります。
Drizzle ORM です。
2025年のGitHub Star成長率は 400%。Prismaの成長率が2%だったのと対照的に、爆発的な勢いでコミュニティが拡大しています。Supabaseの公式ドキュメントでもDrizzleの利用例が紹介され、Cal.comがDrizzleへ移行したことも話題になりました。
「Prismaから乗り換えろ」という記事が多いですが、現場でPrismaを使っていて特に困っていない方も多いはず。この記事では 「Drizzleとは結局何が違うのか」「Prismaとどう使い分けるか」 を整理します。
Drizzle ORMとは
Drizzle ORMは、Andrii Sherman氏、Alex Blokh氏、Dan Kochetov氏らが開発している TypeScriptファーストなORM です。
最大の特徴は 「SQLに限りなく近い書き心地で、型安全」 という設計思想。Prismaが独自のスキーマ言語(.prismaファイル)でデータベースを抽象化するのに対し、DrizzleはTypeScriptのコードがそのままスキーマ定義になり、クエリもSQLの構造をほぼそのまま反映します。
// Drizzle: TypeScriptでスキーマを定義
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
})
// Prisma: 独自のスキーマ言語で定義
model User {
id Int @id @default(autoincrement())
name String
email String @unique
createdAt DateTime @default(now())
}
どちらが良い・悪いではなく、設計思想が根本的に違う ということを最初に押さえておきましょう。
Drizzleの3つの強み
1. SQLを知っている人にとって学習コストがほぼゼロ
DrizzleのクエリビルダーはSQLの構文にほぼ1対1で対応しています。
// Drizzle のクエリ
const result = await db
.select({
name: users.name,
orderCount: count(orders.id),
})
.from(users)
.leftJoin(orders, eq(users.id, orders.userId))
.where(gt(orders.createdAt, new Date('2026-01-01')))
.groupBy(users.name)
.orderBy(desc(count(orders.id)))
-- 上記が生成するSQL(ほぼそのまま)
SELECT users.name, COUNT(orders.id) AS order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.created_at > '2026-01-01'
GROUP BY users.name
ORDER BY COUNT(orders.id) DESC
TypeScriptのコードを見れば、どんなSQLが発行されるかが 一目でわかる のがDrizzleの最大の魅力です。Prismaの場合、複雑なクエリになると「これ、内部的にどんなSQLが走っているんだろう?」と不安になることがありますが、Drizzleにはその心配がありません。
2. 圧倒的に軽い
| 項目 | Drizzle ORM | Prisma |
|---|---|---|
| バンドルサイズ(gzip) | 約7.4KB | 約1.6MB(Prisma 7) |
| 外部依存 | ゼロ | Rustエンジン or TS/WASMエンジン |
| コールドスタート(初回クエリまで) | 約50〜100ms | 約80〜150ms(Prisma 7) |
Drizzleはランタイムに一切の外部依存を持ちません。SQLの文字列を直接組み立てて、ドライバーに渡すだけ。エンジンレイヤーが存在しないため、サーバーレスやエッジ環境でのコールドスタートが非常に速いです。
Prisma 7でRustエンジンがTS/WASMエンジンに置き換わり、サイズは大幅に縮小(85〜90%削減)されましたが、それでもDrizzleの7.4KBとは桁が違います。
3. あらゆるランタイムで動く
DrizzleはNode.js、Bun、Deno、Cloudflare Workers、Supabase Edge Functions、Vercel Edge Functionsなど、JavaScriptが動くあらゆる環境で利用可能です。
特にCloudflare D1(エッジSQLite)との組み合わせは、Drizzleが最も輝くユースケースの一つです。
// Cloudflare Workers + D1 + Drizzle
import { drizzle } from 'drizzle-orm/d1'
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB)
const allUsers = await db.select().from(users)
return Response.json(allUsers)
}
}
Prismaの強み ── Drizzleにないもの
Drizzleの良い点ばかり書きましたが、Prismaが優れている領域 も明確にあります。現場でPrismaを使っているなら、これらの強みを享受しているはずです。
1. Prisma Studio(GUI管理画面)
npx prisma studio で起動するブラウザベースのデータ管理画面は、Prisma独自の強力な機能です。テーブルのデータをスプレッドシートのように閲覧・編集でき、非エンジニアのチームメンバーにも触ってもらえます。
Drizzle Studioも存在しますが、Prisma Studioほどの完成度には達していません。
2. スキーマ言語の読みやすさ
Prismaの .prisma ファイルは、TypeScriptを知らない人でも読めるシンプルさがあります。
model Post {
id Int @id @default(autoincrement())
title String
content String?
author User @relation(fields: [authorId], references: [id])
authorId Int
}
リレーションの定義も直感的で、新しいメンバーのオンボーディングが容易です。Drizzleのスキーマ定義はTypeScriptそのものなので、TypeScriptに慣れていないメンバーには敷居が高い場合があります。
3. マイグレーションのエコシステム
Prisma Migrateは本番環境向けのマイグレーションワークフローが成熟しています。マイグレーション履歴の管理、ベースラインマイグレーション、シャドウデータベースなど、チーム開発で必要な機能が揃っています。
Drizzle Kitもマイグレーション機能を持ち、スキーマ変更の約95%を自動処理できますが、Prisma Migrateほどの実績と安定性はまだありません。
4. 型チェックの速度
Prismaは公式ブログで「PrismaはDrizzleより型チェックが速い」というベンチマークを公開しています。大規模なスキーマ(テーブル数が多い場合)では、Drizzleの型推論がTypeScriptコンパイラに負荷をかけるケースがあります。
5. Prisma 7の進化
2025年11月にリリースされたPrisma 7では、RustエンジンがTypeScript/WASMエンジンに完全置き換えされ、クエリ速度が最大3.4倍向上、バンドルサイズが約14MBから1.6MBへ90%削減されました。かつてのパフォーマンス差は大幅に縮まっています。
両方のクエリを比べてみる
同じ処理をDrizzleとPrismaで書き比べてみましょう。
シンプルなCRUD
// Drizzle
const user = await db.insert(users).values({
name: 'Taro',
email: 'taro@example.com',
}).returning()
// Prisma
const user = await prisma.user.create({
data: {
name: 'Taro',
email: 'taro@example.com',
},
})
シンプルなCRUDでは、どちらも書き心地に大きな差はありません。
リレーションを含む取得
// Drizzle(Relational Queries API)
const postsWithAuthor = await db.query.posts.findMany({
with: {
author: true,
comments: {
with: { user: true },
limit: 5,
},
},
})
// Prisma
const postsWithAuthor = await prisma.post.findMany({
include: {
author: true,
comments: {
include: { user: true },
take: 5,
},
},
})
リレーション取得もほぼ同じ構文で書けます。ただし内部的な違いがあります。Drizzleは常に1つのSQLクエリ を発行するのに対し、Prismaは複数のクエリを発行してアプリケーション層で結合する場合があります。
複雑な集計クエリ
// Drizzle(SQL的に書ける)
const stats = await db
.select({
category: products.category,
avgPrice: avg(products.price),
totalSold: sum(orderItems.quantity),
})
.from(products)
.leftJoin(orderItems, eq(products.id, orderItems.productId))
.groupBy(products.category)
.having(gt(sum(orderItems.quantity), 100))
// Prisma(groupByを使う)
const stats = await prisma.product.groupBy({
by: ['category'],
_avg: { price: true },
// ← JOINを含む集計はPrismaのAPIだけでは表現しにくい
// → $queryRaw でSQL直書きが必要になるケースがある
})
複雑な集計やJOINを伴うクエリ では、Drizzleの「SQL的に書ける」強みが際立ちます。Prismaでは$queryRawでSQL直書きに頼ることになるケースでも、Drizzleなら型安全なクエリビルダーで書けます。
プロジェクトに合わせた使い分けガイド
| あなたのプロジェクト | 推奨 | 理由 |
|---|---|---|
| 既存のPrismaプロジェクト | Prisma継続 | 移行コストに見合うメリットがない場合が多い |
| SQLに強いチーム | Drizzle | 学習コストほぼゼロ。SQLの知識がそのまま活きる |
| Cloudflare Workers / エッジ | Drizzle | 7.4KBのバンドルサイズが圧倒的に有利 |
| サーバーレス(Lambda等) | どちらでもOK | Prisma 7でコールドスタート差が縮小 |
| 非エンジニアもDBを触る | Prisma | Prisma Studioが強い |
| 新規プロジェクト(小〜中規模) | Drizzle | セットアップが速く、軽い |
| 大規模チーム・エンタープライズ | Prisma | マイグレーション、エコシステム、実績 |
| 複雑な集計クエリが多い | Drizzle | SQLライクなクエリビルダーが強い |
重要なのは「どちらが優れているか」ではなく「自分のプロジェクトにどちらが合うか」 です。
Drizzleを5分で試す
興味を持った方のために、最速のセットアップ手順を載せておきます。
# プロジェクト作成
mkdir drizzle-demo && cd drizzle-demo
npm init -y
# Drizzle + PostgreSQLドライバーをインストール
npm install drizzle-orm postgres
npm install -D drizzle-kit typescript @types/node
# TypeScript設定
npx tsc --init
// schema.ts ── スキーマ定義
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
})
// drizzle.config.ts ── Drizzle Kit設定
import { defineConfig } from 'drizzle-kit'
export default defineConfig({
schema: './schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
})
# マイグレーション生成 & 適用
npx drizzle-kit generate
npx drizzle-kit migrate
# Drizzle Studio(GUI)を起動
npx drizzle-kit studio
# → https://local.drizzle.studio でブラウザからDB操作
Prismaを使ったことがある方なら、prisma generate が drizzle-kit generate に、prisma studio が drizzle-kit studio に対応していると考えるとわかりやすいです。
まとめ
| 項目 | Drizzle ORM | Prisma |
|---|---|---|
| 設計思想 | SQLに近いTypeScript ORM | 独自スキーマ言語による抽象化 |
| バンドルサイズ | 7.4KB | 約1.6MB(Prisma 7) |
| クエリスタイル | SQL構文をそのまま反映 | 独自のAPI(直感的) |
| エッジ/サーバーレス | 最適 | Prisma 7で大幅改善 |
| GUI管理画面 | Drizzle Studio(発展途上) | Prisma Studio(成熟) |
| マイグレーション | Drizzle Kit(95%自動) | Prisma Migrate(実績豊富) |
| エコシステム | 急成長中 | 非常に成熟 |
| 向いているケース | エッジ、軽量、SQL重視 | チーム開発、大規模、安定重視 |
Drizzle ORMは「Prismaの代替」というより、「SQLを愛するTypeScriptエンジニアのためのORM」 です。SQLの知識がそのまま武器になる設計は、RDBをしっかり理解している人にとって非常に気持ちの良い開発体験を提供してくれます。
Prismaを使っている現場でも、Drizzleの存在を知っておくことには価値があります。新しいマイクロサービスやエッジAPI、サイドプロジェクトでDrizzleを試してみて、自分のチームに合うかどうかを判断するのが現実的なアプローチではないでしょうか。
参考: