サイトアイコンmaita tomoya dev io

Prisma vs Drizzle vs TypeORM 徹底比較

databases

Prisma vs Drizzle vs TypeORM 徹底比較

概要と歴史

ORM(Object-Relational Mapping)とは

ORMは、プログラミング言語のオブジェクトとリレーショナルデータベースのテーブルを対応付ける技術である。SQLを直接書く代わりに、プログラミング言語のオブジェクトやメソッドを使ってデータベース操作を行える。

ORMの主なメリット:

  • SQLを直接書く量を削減
  • 型安全なデータベース操作(TypeScript環境)
  • マイグレーション管理
  • 複数DBへの対応(PostgreSQL、MySQL、SQLite等)

Prismaとは

Prismaは、2019年に正式リリースされたNode.js/TypeScript向けの次世代ORMである。独自のスキーマ言語(Prisma Schema)でデータモデルを定義し、それから型安全なクライアントを自動生成するアプローチを採用している。

従来のORMが「クラスをテーブルにマッピングする」Active Record/Data Mapperパターンを使うのに対し、Prismaは「スキーマファースト」のアプローチで、より直感的なAPIを提供する。

Drizzleとは

Drizzle ORMは、2022年にリリースされた比較的新しいTypeScript ORMである。「SQLライクな構文をTypeScriptで書く」というアプローチで、SQLの知識をそのまま活かせる設計が特徴だ。「If you know SQL, you know Drizzle」がキャッチフレーズである。

TypeORMとは

TypeORMは、2016年にリリースされたTypeScript/JavaScript向けのORMである。Active RecordパターンとData Mapperパターンの両方をサポートし、デコレータベースのエンティティ定義が特徴だ。JavaのHibernateやPHPのDoctrineに影響を受けている。

主要なマイルストーン

PrismaDrizzleTypeORM
2016年Prisma 1(GraphQL中心)-v0.1リリース
2019年Prisma 2(ORM方向に転換)-v0.2(安定化)
2020年Prisma Client GA-v0.3
2021年Prisma Migrate GA--
2022年-v0.x初期リリース-
2023年Prisma v5(パフォーマンス改善)v0.28(急速な人気獲得)メンテナンス停滞
2024年Prisma v6(Typed SQL等)v0.33+v0.3.x

強みと弱み

Prismaの強みと弱み

観点強み弱み
型安全性スキーマから完全型安全なクライアント生成型が複雑になりすぎることがある
DX(開発体験)直感的なAPI、優れた自動補完Prisma固有のAPI学習が必要
スキーマ管理Prisma Schemaで一元管理独自DSLの学習コスト
マイグレーションPrisma Migrate(自動生成)カスタムマイグレーションの柔軟性
ドキュメント非常に充実-
エコシステムPrisma Studio、Prisma Accelerate等有料サービスへの誘導
パフォーマンスRust製クエリエンジン中間層のオーバーヘッド
SQL制御抽象化されているRaw SQLの書きやすさはDrizzleに劣る
Edge対応Prisma Accelerate経由直接的なEdge対応に制約

Drizzleの強みと弱み

観点強み弱み
SQLライクSQLの知識がそのまま使えるSQL初心者には恩恵が少ない
軽量性ランタイムの依存が最小限機能がPrismaより少ない
パフォーマンスオーバーヘッドが極めて小さいベンチマークはユースケース依存
Edge対応ネイティブにEdge対応-
バンドルサイズ非常に小さい-
TypeScriptTypeScript-firstの設計型の推論が複雑な場合がある
マイグレーションDrizzle Kit(スキーマから生成)Prisma Migrateほど成熟していない
エコシステム急速に成長中Prismaほどの成熟度はない
柔軟性SQLに近い柔軟なクエリ記述抽象化レベルが低い
スキーマ定義TypeScriptで直接定義DSLがないため冗長になることも

TypeORMの強みと弱み

観点強み弱み
歴史最も長い歴史、実績が豊富レガシーな設計パターン
デコレータエンティティ定義が宣言的デコレータの依存
Active RecordRails/Laravelに近い使い方密結合になりやすい
Data Mapper疎結合な設計も可能設定が複雑
DB対応PostgreSQL, MySQL, SQLite, MSSQL, Oracle等-
メンテナンス-メンテナンスが停滞気味
型安全性デコレータベースの型推論Prisma/Drizzleほどの型安全性はない
ドキュメント一応充実最新情報の更新が遅れがち

スキーマ定義の比較

Prisma

// schema.prisma(独自DSL)
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  posts     Post[]
  createdAt DateTime @default(now())
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

Drizzle

// schema.ts(TypeScript)
import { pgTable, serial, varchar, text, boolean, integer, timestamp } from 'drizzle-orm/pg-core'

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  email: varchar('email', { length: 255 }).unique().notNull(),
  name: varchar('name', { length: 255 }),
  createdAt: timestamp('created_at').defaultNow(),
})

export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: varchar('title', { length: 255 }).notNull(),
  content: text('content'),
  published: boolean('published').default(false),
  authorId: integer('author_id').references(() => users.id),
})

TypeORM

// user.entity.ts(デコレータ)
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ unique: true })
  email: string

  @Column({ nullable: true })
  name: string

  @OneToMany(() => Post, (post) => post.author)
  posts: Post[]

  @CreateDateColumn()
  createdAt: Date
}

クエリ記述の比較

基本的なCRUD

操作PrismaDrizzleTypeORM
全件取得prisma.user.findMany()db.select().from(users)userRepo.find()
条件付き取得prisma.user.findMany({ where: { email: 'x' } })db.select().from(users).where(eq(users.email, 'x'))userRepo.find({ where: { email: 'x' } })
1件取得prisma.user.findUnique({ where: { id: 1 } })db.select().from(users).where(eq(users.id, 1))userRepo.findOneBy({ id: 1 })
作成prisma.user.create({ data: {...} })db.insert(users).values({...})userRepo.save({...})
更新prisma.user.update({ where: { id: 1 }, data: {...} })db.update(users).set({...}).where(eq(users.id, 1))userRepo.update(1, {...})
削除prisma.user.delete({ where: { id: 1 } })db.delete(users).where(eq(users.id, 1))userRepo.delete(1)

リレーション取得

方法PrismaDrizzleTypeORM
Eager Loadinginclude: { posts: true }.leftJoin(posts, eq(...))relations: ['posts']
条件付きinclude: { posts: { where: {...} } }.leftJoin + .whereQueryBuilderで記述
ネストinclude: { posts: { include: { comments: true } } }複数のJOINrelations: ['posts', 'posts.comments']

パフォーマンス比較

オーバーヘッド

ORMランタイムオーバーヘッド理由
PrismaRustクエリエンジンが中間層として動作
DrizzleSQLに近い薄いラッパー
TypeORM中〜高メタデータリフレクション、エンティティ管理

バンドルサイズ(概算)

ORMパッケージサイズ
Prisma Client約2-5MB(クエリエンジン含む)
Drizzle約50-100KB
TypeORM約500KB-1MB

クエリ生成効率

観点PrismaDrizzleTypeORM
N+1防止includeで自動JOIN/サブクエリ開発者がJOINを明示eager:trueまたはQueryBuilder
バッチ処理createMany, updateManyバルクInsert/Updatesave(配列)
Raw SQLprisma.$queryRawsql...query()

マイグレーション比較

項目Prisma MigrateDrizzle KitTypeORM Migration
生成方法スキーマ差分から自動生成スキーマ差分から自動生成手動 or 自動同期
生成物SQLファイルSQLファイルTypeScriptファイル
ロールバックリセット(prisma migrate reset)カスタムdown()メソッド
本番デプロイprisma migrate deploydrizzle-kit pushtypeorm migration:run
シードprisma db seed手動スクリプト手動スクリプト

Edge Runtime対応

サーバーレスやEdge環境(Cloudflare Workers、Vercel Edge等)での対応状況。

項目PrismaDrizzleTypeORM
Cloudflare WorkersPrisma Accelerate経由ネイティブ対応非対応
Vercel EdgePrisma Accelerate経由ネイティブ対応非対応
Deno対応対応限定的
Bun対応対応限定的
コールドスタートやや遅い(エンジン初期化)速い

適しているユースケース

Prismaが適しているケース

  • TypeScript開発で最大限の型安全性: スキーマから自動生成される型
  • 大規模プロジェクト: 充実したエコシステムとドキュメント
  • チーム開発: 統一されたスキーマ管理
  • SQLに詳しくないチーム: 直感的なAPI
  • 複雑なリレーション: includeによるシンプルなデータ取得

Drizzleが適しているケース

  • SQLに精通した開発者: SQLの知識を直接活かせる
  • Edge/サーバーレス: 軽量でEdge対応
  • パフォーマンス重視: 最小のオーバーヘッド
  • バンドルサイズ重視: フロントエンド寄りのバックエンド
  • 柔軟なクエリ: SQLに近い表現力

TypeORMが適しているケース

  • 既存TypeORMプロジェクト: 移行コストを避けたい
  • Active Recordパターン: Rails/Laravel経験者
  • NestJSプロジェクト: @nestjs/typeormとの統合
  • 多数のDB対応: Oracle、MSSQL等の対応が必要

人気と採用動向

npmダウンロード数(2026年時点、週間概算)

ORM週間ダウンロード数(概算)
Prisma約300万+
TypeORM約200万+
Drizzle約100万+

トレンド

観点傾向
新規プロジェクトPrisma or Drizzleが選ばれることが多い
既存プロジェクトTypeORMの継続利用
Edge/サーバーレスDrizzleが急増
エンタープライズPrismaが主流
個人開発Drizzle人気が上昇中

他のORM/クエリビルダー

Prisma、Drizzle、TypeORM以外にも選択肢がある。

ライブラリ特徴
Knex.jsSQLクエリビルダー(ORMではない)
Sequelize歴史あるNode.js ORM(JavaScript中心)
MikroORMData Mapperパターン、Unit of Work
Kysely型安全SQLクエリビルダー
Objection.jsKnex.jsベースのORM

選択の判断フロー

TypeScript開発?
|
+-- いいえ → Sequelize or Knex.js
+-- はい
    |
    +-- SQLに精通している?
    |   +-- はい → Drizzle
    |   +-- いいえ → Prisma
    |
    +-- Edge/サーバーレス?
    |   +-- はい → Drizzle(軽量)
    |   +-- いいえ → Prisma or Drizzle
    |
    +-- 既存TypeORMプロジェクト?
    |   +-- はい → TypeORM継続 or 段階的にPrisma/Drizzleへ移行
    |   +-- いいえ → Prisma or Drizzle
    |
    +-- NestJS?
        +-- Prisma(@nestjs/prismaが公式)
        +-- Drizzle(手動統合)
        +-- TypeORM(@nestjs/typeormが公式)

まとめ

TypeScript/Node.jsのORM選択は、2026年現在「Prisma vs Drizzle」の二強時代に入っている。

Prismaを選ぶべき場合:

  • 最大限の型安全性と開発体験を重視
  • SQLの知識が限られたチーム
  • 充実したエコシステム(Studio、Accelerate等)を活用したい
  • 大規模プロジェクトで統一的なスキーマ管理が必要

Drizzleを選ぶべき場合:

  • SQLの知識を活かしたい
  • Edge/サーバーレス環境
  • パフォーマンスとバンドルサイズが重要
  • SQLに近い柔軟なクエリ記述が必要

TypeORMを選ぶべき場合:

  • 既存プロジェクトの保守
  • Active Recordパターンに慣れている
  • Oracle、MSSQL等の特殊なDB対応

どのORMを選んでも、TypeScriptの型システムを活用したデータベース操作が可能であり、生のSQLと比較して開発効率と安全性が大幅に向上する。プロジェクトの要件、チームのスキル、デプロイ環境を総合的に考慮して選択することが重要だ。


参考リンク