これまで ORM と言えば Prisma と思っていましたが、当然他にも選択肢があるわけで、先日 Drizzle というのがあることを知りました。
Prisma と Drizzle の特徴を理解するためのインプットの機会としたいと思います!
検討する際の一助だと捉えていただけますと幸いです。
Prisma と Drizzle の基本的な違い
Prisma
- マイグレーションツールが組み込みで、
prisma migrateで簡単 - 型安全性、自動補完が強力
- GUI(Prisma Studio)でデータ確認できる
-
.prismaファイルの学習が必要ではあるが、ドキュメントが充実しトータルで学習コストが低い - バンドルサイズが大きく、複雑な SQL クエリが書きにくい
Drizzle
- ドキュメントは充足してないが、TypeScript でスキーマを定義できる(TypeScriptネイティブ)
- バンドルサイズが小さく、複雑なクエリも書きやすい
- 生 SQL の知識がそのまま活かせる
- Prisma より覚えることが多い
- Prisma Studio みたいな便利ツールが少ない
Prisma と Drizzle のコード比較
Prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
// クエリ
const users = await prisma.user.findMany({
where: { email: { contains: '@example.com' } },
include: { posts: true }
})
普段書いている言語とは少し書き方が異なるので、とっつきにくさはあるかもしれません。
Drizzle
export const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').unique(),
name: text('name'),
})
// クエリ
const users = await db
.select()
.from(users)
.where(like(users.email, '%@example.com%'))
.leftJoin(posts, eq(posts.userId, users.id))
Drizzle の方が馴染みのある書き方です。少し zod に似た記述方法である印象を受けます。
Prisma と Drizzle どっちを選ぶべきか
Prisma を選ぶべき場合
- チーム開発で統一された開発体験が欲しい
- マイグレーション管理を簡単にしたい
- 学習コストを抑えたい
- 素早くプロトタイプ作りたい
Drizzle を選ぶべき場合
- Edge ランタイム(Cloudflare Workers等)で使う
- パフォーマンスを最優先にしたい
- 複雑な SQL クエリが必要
- バンドルサイズを小さくしたい
最近のトレンドとしては、「Edge コンピューティングの普及」「Next.js App Router との相性の良さ」「パフォーマンス志向」という点で Drizzle が人気のようです。
フレームワーク別の推奨まとめ表
| フレームワーク | 推奨 | 理由 |
|---|---|---|
| Next.js App Router | Drizzle | Edge 対応、軽量 |
| Remix | Drizzle | Loader パターン、Edge |
| Astro | Drizzle | SSG/SSR、軽量 |
| Hono | Drizzle | Edge 専用 |
どのフレームワークを利用するのでも、 Edge での動作を考えると軽量である Drizzle の方が良さそうです。
まとめ
Drizzle を知って Edge 環境での動作を優先するなら良さそうだと思います。
反面、TypeScript の知識でスキーマを定義できますが、 SQL の知識が前提となっている部分は導入のハードルになりそうだと感じます。
個人開発であれば、Vercel や Cloudflare を利用することも多いかと思うので Drizzle を利用するのは良さそうかと思います。
とはいえ、大規模でチームのメンバーが多いなどの状況によっては Prisma を選択した方が良い印象です。
一見 Drizzle の方が良いかと思いましたが、現時点で長期的な運用という観点で判断すれば Prisma の方が実装例も世の中的にもソリューションが多くあるため選択時にはその点も考慮したいと思います。