プログラミング ソフトウェア 公開日 2026.05.15 更新日 2026.05.15

Drizzle ORM とは何か?SQL に近い TypeScript ORM の特徴と Prisma との使い分け

Drizzle は TypeScript で `SQL を書く感覚に近い ORM』として急成長しているライブラリです。スキーマも TS で書き、生成された型がそのまま使える / Edge ランタイムで動く / バンドルが軽い といった特徴があり、Prisma の代替候補として支持を集めています。仕組み・基本の使い方・Prisma との比較を整理します。

先に要点

  • DrizzleTypeScript 向けの ORM で、` SQL を書く感覚に近い API` スキーマも TS で書く』 ことを売りにしている。Prisma に対する `SQL リテラルな代替案』 として急成長中。
  • スキーマは ` schema.ts』 に書き、`drizzle-kit』 がそこから DB マイグレーション SQL を生成。`独自スキーマ言語 → 型生成』 の二段構えを使わずに済む。
  • Edge ランタイム対応(Cloudflare Workers / Vercel Edge Functions など)、軽量バンドルクエリビルダ自体は依存ゼロ寄り、というモダンな設計。Edge FunctionDB を触りたい案件で特に効く。
  • 万能ではない。` 自動マイグレーション』 や `データブラウザ UI(Studio)』 の成熟度は Prisma がまだ強い場面もある。`SQL を読み書きする苦に慣れているか / 慣れたいか』 で向き不向きが分かれる。

Drizzle ってよく聞くけど、Prisma で十分じゃないの?』 Drizzle はなぜ Edge で動くの?』 `スキーマを TS で書く、ってどういう意味?』 ── 2023年あたりから急に名前を聞くようになった TypeScript ORM の代表格が Drizzle です。

ざっくり言うと、Drizzle は SQL に近い感覚で書ける TypeScript ORM』</strong> で、スキーマも TS、クエリも TS、型推論はビルド時にゼロコスト』 という設計を取っています。 Prisma のように 独自言語(prisma schema)で書いて専用エンジンに渡す』 のではなく、<strong> TS から SQL を組み立てて、生のドライバに渡すだけ』 という割り切りで、Edge で動く』 バンドルが軽い』 を実現しているのが特徴です。

この記事では、2026年5月時点の Drizzle の状況をベースに、何ができるか・Prisma との違い・どう書くのか・Edge での使い方・採用判断軸 を、`Prisma は触っているけど Drizzle はこれから』 レベルから順に整理します。

なぜ Drizzle が出てきたか

Drizzle が広まった背景には、Prisma が広く使われる中で見えてきた `合わない場面』 がありました。

Edge ランタイムで動かない / 動かしづらい

Prisma は長らく `Edge では制限あり』 で、Prisma Accelerate / Data Proxy が必要だった。`Edge Function から DB を直接叩きたい』 という要求にスムーズに応えられない時期が長かった。

② バンドルサイズが重い

Prisma の Query Engine はバイナリで、サーバレス / Edge では制約。`シンプルな関数なのに数MBのバイナリ』 がパッケージサイズに響く。

SQL からの距離感

Prisma の `findMany / where』 系 API は便利だが、`本当に SQL でやりたい操作』(複雑な JOIN、CTE、window 関数)に踏み込むと一気に書きづらくなる。

④ スキーマ言語の独自性

`schema.prisma』 は便利だが TS 文化からの距離がある。`TS の世界でスキーマも完結したい』 という声と相性が良くない側面があった。

Drizzle は ` Prisma が苦手としていた領域に、TS ネイティブで応える』 立ち位置を取って、特に Edge / Serverless / モノレポ系のプロジェクトで急速に採用が広がっています。

Drizzle の基本構成

Drizzle は大きく2つのパッケージで成り立っています。

`drizzle-orm』(ランタイム)

クエリビルダ本体。`db.select().from(users).where(...)』 のように SQL に近い形で TS で書ける。型は完全にコンパイル時推論で、ランタイムの型情報には依存しない。

`drizzle-kit』(マイグレーション)

`schema.ts』 と DB の状態を比較して、マイグレーション SQL を生成 / 実行 する CLI。`drizzle-kit generate』 → `drizzle-kit migrate』 が基本フロー。

対応 DB

PostgreSQL / MySQL / SQLite / Cloudflare D1 / Turso / Neon / Vercel Postgres など、主要な RDB をカバー。Edge 向け HTTP / WebSocket ドライバとも統合済み。

Drizzle Studio

DB の中身をブラウザから見たり編集できる Studio UI。Prisma Studio に近い体験を提供する公式ツール。

ORM + マイグレーションツール + Studio』 という構成は Prisma と似ていますが、<strong> ランタイムが軽量で、Edge にそのまま乗る』 のが大きな違いです。

基本の書き方 — スキーマと最小クエリ

最小例で雰囲気をつかみます。

// src/db/schema.ts
import { pgTable, serial, text, integer, timestamp } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  email: text('email').notNull().unique(),
  name: text('name').notNull(),
  age: integer('age'),
  createdAt: timestamp('created_at').defaultNow(),
});

export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
// src/db/index.ts
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';

const client = postgres(process.env.DATABASE_URL!);
export const db = drizzle(client);
// 使うとき
import { db } from '@/db';
import { users } from '@/db/schema';
import { eq } from 'drizzle-orm';

const allUsers = await db.select().from(users);
const alice = await db.select().from(users).where(eq(users.email, 'alice@example.com'));
const inserted = await db.insert(users).values({ email: 'bob@example.com', name: 'Bob' }).returning();

SQL に近い API

`select / from / where / leftJoin / groupBy / orderBy』 ─ SQL の節をそのまま関数呼び出しに置き換えた感覚。`SELECT * FROM users WHERE email = ...』 が `db.select().from(users).where(eq(users.email, ...))』 と書ける。

型は推論される

`typeof users.$inferSelect』 で `SELECT したときの行の型』 を、`$inferInsert』 で `INSERT に渡す形』 を取得できる。Zod と組み合わせて入力検証に流すのも一行で書ける。

マイグレーション

`schema.ts』 を変更 → `drizzle-kit generate』 で diff から SQL を生成 → `drizzle-kit migrate』 で本番 DB に適用。SQL ファイルが手元に残る ので、レビューや差し戻しがしやすい。

エスケープと安全性

パラメータバインディングが自動で行われるため、`$ {value}』 を文字列連結する代わりに `eq(column, value)』 のようにビルダー API を使えば SQL インジェクションを防げる。

SQL を書ける人なら一日で覚えられる』 のが Drizzle の体感です。 逆に <strong> SQL があまり得意でない / 触れたくない』 場合は、Drizzle はやや辛い選択になる ことがあります。

Prisma との比較

`Drizzle と Prisma、どっちを選ぶ?』 の判断材料を表で並べます。

Prisma Drizzle
スキーマ定義 独自 DSL(`schema.prisma』) TypeScript ファイル
クエリ API findMany / where 等の抽象的 API SQL に近いビルダ API
型推論 生成された型(`prisma generate』) TS の型推論で即時
Edge ランタイム対応 制約あり(Accelerate / Data Proxy 経由が中心) 標準で対応
バンドルサイズ 大きめ(Query Engine バイナリ) 小さい(純 TS)
マイグレーション `prisma migrate』(成熟) `drizzle-kit generate / migrate』(SQLが残る)
Studio(GUI) Prisma Studio(成熟) Drizzle Studio(発展中)
SQL からの距離 遠い(便利だが SQL を隠す) 近い(SQL を読み書きする感覚)
学習コスト 独自概念は多いが API は親しみやすい SQL に慣れている人ほど低い

どっちが優れているか』 は <strong> どのスタイルで DB を扱いたいか』 の好み によります。 Prisma 派は 便利な抽象 API でアプリの本質に集中したい』、Drizzle 派は SQL に近い感覚で透過的に扱いたい』 の両者で、それぞれ理にかなっています。

Edge / Serverless での強み

Drizzle が `今選ばれている理由』 で大きいのが、Edge / Serverless との相性です。

HTTP / WebSocket ドライバ

Neon / Turso / Cloudflare D1 / PlanetScale など、Edge 互換の HTTP / WebSocket ベース DB ドライバを公式サポート。`Edge から DB に直接アクセス』 が普通に書ける。

バンドルが軽い

Drizzle のクエリビルダ自体は TS なので、最終バンドルは数十KB程度。`Cold start が短い』 `転送量が少ない』 という Edge 環境の制約と相性が良い。

[Vercel Edge / Serverless との組み合わせ](/articles/vercel-edge-function-vs-serverless-function-comparison)

Edge Function で DB を触る構成は、`Drizzle + Neon』 `Drizzle + Vercel Postgres』 が事実上の定番。AI 時代の Vercel のストリーミング応答にも組み込みやすい。

Cloudflare Workers + D1

Cloudflare の SQLite ベース D1 で Drizzle を使う構成は、`軽量・分散・低コスト』 の代表的な選択肢。`Cloudflare で全部完結する』 構成と相性が良い。

Edge から DB に触りたい』 場面で、Drizzle は 重要なオプションのひとつ』 を超えて、`デファクトに近い選択肢』 になりつつあります。

どこで詰まりやすいか

便利な反面、現場でハマりやすいポイントもあります。

①リレーションの読み込み

` ユーザーとその投稿を一発で取りたい』 系の操作は、Drizzle では ` Relations API』(`with: { posts: true }』 のような書き方)を使う。`SQL の JOIN を直接書く』 派と、`Relations 経由で書く』 派の二択で、どちらにするかチーム内で揃えるのが大事。

② マイグレーションの差分検出

` schema.ts を変更 → drizzle-kit generate』 で SQL が自動生成されるが、`予期しない差分』 が混じることがある(命名規約、デフォルト値、null 制約の解釈など)。生成された SQL は必ず人がレビューする のが鉄則。

③ JSON 列の扱い

` jsonb』 型のカラムを扱うときに、`Drizzle の型推論をどこまで信用するか』 が論点になる。Zod でランタイム検証も合わせて入れる のが安全策。

④ ドキュメントの追従性

急成長中のライブラリで、`v1.x→v2.x』 で API が少し変わる場面がある。最新版を採用するならリリースノートを必ず確認、`動いていたのに動かなくなった』 を防ぐ。

特に マイグレーション SQL のレビュー は省略しないほうがよく、`drizzle-kit が生成した SQL を読まずに本番に流す』 のは事故の元です。

採用判断のチェックリスト

`Drizzle を選ぶか Prisma のままでいくか』 の判断軸を整理しておきます。

読み込み中...

Prisma が悪い』 ではなく、<strong> Drizzle のほうが合う場面が確実に存在するようになった』 というのが現状の正確な認識です。 pnpm + tRPC + Drizzle + Zod の組み合わせは、`モノレポ TS フルスタック』 の現代的な定番構成のひとつになっています。

AI 時代の Drizzle 観

AI 連携のアプリでも Drizzle はちょうど良いフィット感があります。

Edge でストリーミング応答

AI のストリーミング応答を Edge Function で扱うときに、`DB を Edge から読む』 が Drizzle で素直に書ける。`応答の途中で必要なデータを引き当てる』 タイプの UX を組みやすい。

スキーマと AI プロンプトの統合

` Drizzle のスキーマから AI 用のメタ情報を生成する』 ような連携が書きやすい。`AI に DB の構造を渡して、適切な SQL を作らせる』 系の MCP 連携でも、TS の型情報をそのまま使える。

ベクトル検索との相性

`pgvector』 のような拡張を持つ PostgreSQL を Drizzle で扱う運用は普通にできる。`埋め込みベクトルを DB に保存 → 類似検索』 という AI 系の頻出パターンをそのまま書ける。

プロンプトに含めやすい

` SQL に近い構文』 なので、AI に渡したときも `Drizzle で書きたいクエリ』 のニュアンスが伝わりやすく、出力されたコードを使い回しやすい。

`AI と DB をつなぐ』 文脈で、Drizzle のシンプルさと TS ネイティブ性が活きる場面が増えています。

Drizzle ORM に関するよくある質問

Q. Drizzle は商用利用できますか?

A. はい。Apache 2.0 ライセンスで OSS として公開されており、商用利用・改変・再配布が自由です。バックエンドの会社 Drizzle Team が継続開発しており、企業導入も増えています。

Q. すでに Prisma で動いているプロジェクトを Drizzle に移行すべきですか?

A. 急ぐ必要はない ケースが多いです。Prisma で何の不満もない』 ならそのままで、Edge で動かしたい』 `バンドルが重い』 などの具体的な問題が出てきたタイミングで検討するのが現実的です。

Q. Drizzle で生 SQL を書くこともできますか?

A. できます。sql』 タグドテンプレート(sql`SELECT ...``)で生 SQL を埋め込めます。`複雑なクエリは生 SQL、シンプルなものはビルダー API』 のような混在運用も普通に行われています。

Q. リレーションの書き方が複数あって迷います。

A. Drizzle にはクエリビルダ(leftJoin』 / innerJoin』)と Relations API(with: { posts: true }』)の2系統があります。<strong> 単純な取得は Relations API、複雑な集計は JOIN を直接書く』 という棲み分けが現場では多いです。

Q. テストはどう書きますか?

A. 実 DB を使った統合テスト が最も信頼性が高いです。SQLite をテスト用に立ててマイグレーションを流す、DockerPostgreSQL を立ち上げる、などの方法が一般的です。`db を直接モック』 は型整合が辛くなりがちで避けるのが安全です。

Q. Drizzle Studio は本番 DB に繋いで大丈夫ですか?

A. 接続は可能ですが、本番 DB に直接 GUI から繋ぐのは権限とログの観点で推奨されない ことが多いです。開発 DB / ステージング DB』 で使うのが基本で、本番は限定的なクエリツール(psql』 や運用用ダッシュボード)に任せるのが安全です。

Q. Drizzle の学習にどのくらいかかりますか?

A. SQL に慣れている人なら 半日〜1 日 で書き始められます。スキーマ定義、select / insert / update / delete』、where』 や `eq / and / or』 等のオペレータを覚えれば、9 割の操作はカバーできます。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。