メインコンテンツへスキップ

Drizzle

PrismaとDrizzleは、データベースを扱う上で異なるアプローチを取ります。DrizzleはSQLに近いクエリを記述することを好む開発者に訴求する一方で、Prismaは明瞭さ、コラボレーション、長期的な保守性が重要な本番アプリケーションを構築・保守するチームをサポートするように設計されています。

両ライブラリは同様の問題を解決しますが、その動作は大きく異なり、それぞれに長所と短所があります。どちらを選択するかは、プロジェクトのニーズと、そのプロジェクトにとって何が重要かというトレードオフによって決まります。

Drizzle vs Prisma ORM

Drizzle は、JavaScript/TypeScript関数でSQLクエリを構成できる従来のSQLクエリビルダーです。データベースのクエリやマイグレーションの実行に使用できます。Drizzleはまた、SQLからの抽象度が高いQueries APIも提供しており、ネストされた関連を読み取るために使用できます。DrizzleスキーマはTypeScriptファイルで定義され、これらはSQLマイグレーションを生成するために使用され、その後データベースに対して実行されます。

Prisma ORM は、肥大化したモデルインスタンス、ビジネスロジックとストレージロジックの混在、型安全性の欠如、遅延ロードなどによって引き起こされる予測不能なクエリといった、従来のORMの多くの問題を軽減します。宣言的な方法でアプリケーションモデルを定義するためにPrismaスキーマを使用します。Prisma Migrateは、PrismaスキーマからSQLマイグレーションを生成し、データベースに対して実行することを可能にします。CRUDクエリは、Node.jsおよびTypeScript向けの軽量で完全に型安全なデータベースクライアントであるPrisma Clientによって提供されます。

Prisma: チーム向けに構築

Prismaは、特に全員がSQLエキスパートではない場合に、チームがより早く出荷できるよう設計されています。

  • SQLのボトルネックなし: Prismaを使用すれば、生産的になるために深いSQL知識は必要ありません。チーム全体がバックエンドコードに貢献でき、生クエリの記述やデータベースロジックのデバッグを一人の人間に頼る必要がありません。
  • 共有されたメンタルモデル: Prismaのスキーマは人間が読解可能で、理解しやすいです。アプリケーションのデータモデルを単一の一貫した視点で提供します。
  • コードレビューの容易化: スキーマの変更とデータアクセスパターンは透過的で一貫性があり、レビューアがバックエンドの変更を理解し承認しやすくなります。
  • 予測可能なワークフロー: Prismaはマイグレーションの生成、クライアントの型付け、クエリの構築を自動化するため、チームがそれを行う必要はありません。

Drizzleは、SQLを知っているか学ぶことを好む一人の開発者の手にかかれば素晴らしいものになるかもしれません。しかし、チームが関与すると、Prismaは開発を遅らせる摩擦と知識のリスクを取り除きます。

型安全

Drizzleは完全に型安全ではありません。サードパーティによって行われたこの比較調査で引用されているように、「Drizzleは型安全の印象を与えます。しかし、クエリ結果のみが型情報を持っています。Drizzleでは無効なクエリを記述することができます。」

Prismaでは、生成される型のおかげで完全な型安全性が得られます。これは、コードを記述したりチームメンバーと協力したりする際に、エラーの可能性が低いことを意味します。

Prisma Schema を単一の真実のソースとして

Prismaでは、データモデルは単一のファイル、schema.prismaに存在します。

  • 明示的: 型を推論したり、SQL生成関数を解読したりする必要はありません。スキーマはそこにあります。
  • 読みやすい: 技術者ではないチームメイトでも、モデルと関係を理解できます。
  • すべてを駆動する: マイグレーション、TypeScript型、オートコンプリート、ERD生成など、すべてがスキーマから生成されます。

対照的に、DrizzleのスキーマはTypeScriptコードで構築されており、これにより完全なデータモデルを視覚化するのが難しくなり、認知負荷が増大し、コードベース全体でモデルの定義に一貫性がなくなる可能性があります。詳細はこちらで、私たちがPSL (Prisma Schema Language) を重視する理由をご覧ください。

スキーマをERDとして見たいですか?Prismaでは、コマンドは1つだけです: npx prisma generate && npx prisma-erd-generator

APIデザインと抽象化レベル

DrizzleとPrisma ORMは異なる抽象化レベルで動作します。Drizzleの哲学は「SQLを知っていれば、Drizzle ORMを知っている」というものです。APIにおいてSQLを反映する一方で、Prisma Clientはアプリケーション開発者の共通のタスクを念頭に置いて設計された、より高レベルの抽象化を提供します。Prisma ORMのAPIデザインは、正しいことを簡単にするという考え方に強く傾倒しています。

Prisma Clientはより高い抽象化レベルで動作しますが、いつでも生のSQLにドロップダウンできます。ただし、Prisma ORMの完全な使用とアプリケーションの開発にはSQLの知識は必要ありません。Prisma ORMの目標は、開発者にとって使い慣れた開発者体験と生産性に焦点を当てたクエリ構文を構築することです。詳細はこちらで学ぶことができます:Prismaの利点

Prisma Client APIでは表現できない少数のクエリについては、Prisma ORMはTypedSQLも提供しており、.sqlファイルを直接利用することで、より馴染み深く型安全な体験を提供します。既存のSQLツールとワークフローは、Prisma Clientと連携して、希望する任意の抽象化レベルに対応できます。

Prisma ORMではTypedSQLで完全に型付けされたSQLクエリが利用可能ですが、以下のセクションでは、PrismaとDrizzleのAPIがどのように異なり、これらのケースにおけるPrisma ORMのAPI設計の根拠が何かをいくつかの例で検証します。

データモデリング

PrismaモデルはPrismaスキーマで定義され、Drizzleはテーブル定義にTypeScript関数を使用します。これらの関数はエクスポートされ、クエリで使用されます。

Prismaは軽量なデータベースクライアントを生成し、Prismaスキーマで定義されたモデルのデータの読み書き用に、DataMapper ORMパターンに従った、調整済みで完全に型安全なAPIを公開します。

Prisma ORMのデータモデリング用DSLは、無駄がなく、シンプルで直感的に使えます。VS Codeでデータをモデリングする際、Prisma ORMの強力なVS Code拡張機能の恩恵を受け、オートコンプリート、クイックフィックス、定義へのジャンプなどの機能により開発者の生産性を向上させることができます。一方、DrizzleのTypeScriptの使用は、追加の柔軟性(例えば、コードの再利用を介して)のためにTypeScriptのパワーに頼ることができることを意味します。

Prisma ORM
model User {
id Int @id @default(autoincrement())
name String?
email String @unique
posts Post[]
}

model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int?
author User? @relation(fields: [authorId], references: [id])
}
Drizzle
import {
boolean,
integer,
pgTable,
serial,
text,
uniqueIndex,
varchar,
} from 'drizzle-orm/pg-core'

export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: varchar('name', { length: 256 }),
email: varchar('email', { length: 256 }).unique(),
})

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

マイグレーション

DrizzleとPrisma ORMの間で、マイグレーションの仕組みは似ています。どちらのツールも、提供されたモデル定義に基づいてSQLファイルを生成し、それらをデータベースに対して実行するためのCLIを提供するアプローチに従います。SQLファイルは、マイグレーションが実行される前に変更できるため、どちらのマイグレーションシステムでもカスタムデータベース操作を実行できます。

クエリ

DrizzleとPrisma ORMの両方で、プレーンなクエリを構築するのは自然です。DrizzleのQueries APIを使用すると、両者のアプローチは非常に似ています。

Prisma ORM
// find all users
const allUsers = await prisma.user.findMany()

// find a single user
const user = await prisma.user.findFirst({
where: { id: 27 },
})

// find a unique user
const user = await prisma.user.findUnique({
where: { email: 'nilu@prisma.io' },
})
Drizzle
import { eq } from 'drizzle-orm'

// find all users
const allUsers = await db.query.users.findMany()

// find a single user
const user = await db.query.users.findFirst({
where: eq(users.id, 1),
})

// find a unique post
const user = await db.query.users.findFirst({
where: eq(users.email, 'nilu@prisma.io'),
})

ミューテーション(createupdatedelete)を実行する場合、Drizzle Queries APIは利用できません。これらの場合、DrizzleのSQLライクなAPIを使用する必要があります。

Prisma ORM
// create a user
const user = await prisma.user.create({
data: {
name: 'Nilu',
email: 'nilu@prisma.io',
},
})

// update a user
const user = await prisma.user.update({
where: { email: 'nilu@prisma.io' },
data: { name: 'Another Nilu' },
})

// delete a user
const deletedUser = await prisma.user.delete({
where: { email: 'nilu@prisma.io' },
})
Drizzle
// create a user
const user = await db.insert(users).values({
name: 'Nilu',
email: 'nilu@prisma.io',
})

// update a user
const user = await db
.update(users)
.set({ name: 'Another Nilu' })
.where(eq(users.email, 'nilu@prisma.io'))
.returning()

// delete a user
const deletedUser = await db
.delete(users)
.where(eq(users.email, 'nilu@prisma.io'))
.returning()

リレーション

外部キーで接続されたレコードを扱うことは、SQLでは非常に複雑になることがあります。Prisma ORMの仮想リレーションフィールドの概念は、アプリケーション開発者が関連データを扱うための直感的で便利な方法を可能にします。Prisma ORMのアプローチのいくつかの利点です

  • 流暢なAPIによるリレーションのトラバース(ドキュメント)
  • 接続されたレコードの更新/作成を可能にするネストされた書き込み(ドキュメント)
  • 関連レコードへのフィルター適用(ドキュメント)
  • 基となるSQLを気にせずに、ネストされたデータを簡単かつ型安全にクエリ(ドキュメント)
  • モデルとそのリレーションに基づくネストされたTypeScriptの型付けを作成(ドキュメント)
  • リレーションフィールドを介したデータモデルにおけるリレーションの直感的なモデリング(ドキュメント)
  • リレーションテーブル(JOIN、リンク、ピボット、ジャンクションテーブルと呼ばれることもある)の暗黙的な扱い(ドキュメント)
Prisma ORM
const posts = await prisma.post.findMany({
include: {
author: true,
},
})
Drizzle
const posts = await db.query.posts.findMany({
with: {
author: true,
},
})

フィルタリング

Drizzleは、特定のSQL方言のための基となるフィルターと条件演算子を公開しています。一方、Prisma ORMは、より汎用的な演算子のセットを提供しており、これらは直感的に使用できます。

DrizzleとPrisma ORMのフィルタリングAPIがどのように異なるかを示す良い例は、stringフィルターを見ることです。Drizzleがlikeilikeのフィルターを提供する一方で、Prisma ORMは開発者が使用できるより具体的な演算子を提供します。例えば、containsstartsWithendsWithなどです。

Prisma ORM
// case sensitive filter
const posts = await prisma.post.findMany({
where: {
title: 'Hello World',
},
})

// case insensitive filter
const posts = await prisma.post.findMany({
where: {
title: 'Hello World',
mode: 'insensitive',
},
})
Drizzle
// case sensitive filter
const posts = await db
.select()
.from(posts)
.where(like(posts.title, 'Hello World'))

// case insensitive filter
const posts = await db
.select()
.from(posts)
.where(ilike(posts.title, 'Hello World'))
Prisma ORM
const posts = await prisma.post.findMany({
where: {
title: {
contains: 'Hello World',
},
},
})
Drizzle
const posts = await db
.select()
.from(posts)
.where(ilike(posts.title, '%Hello World%'))
Prisma ORM
const posts = await prisma.post.findMany({
where: {
title: {
startsWith: 'Hello World',
},
},
})
Drizzle
const posts = await db
.select()
.from(posts)
.where(ilike(posts.title, 'Hello World%'))
Prisma ORM
const posts = await prisma.post.findMany({
where: {
title: {
endsWith: 'Hello World',
},
},
})
Drizzle
const posts = await db
.select()
.from(posts)
.where(ilike(posts.title, '%Hello World'))

可観測性

DrizzleとPrisma ORMの両方に、クエリと生成された基盤となるSQLをログに記録する機能があります。

Prisma ORMには、チームがデータ使用状況をより良く理解するのに役立つ追加機能がクライアントに組み込まれています。メトリクストレーシングは、いつでも有効にでき、クエリごとの情報を提供する2つの機能です。この情報は外部ツールと統合でき、時間の経過とともにパフォーマンスを追跡できます。

追加プロダクト

DrizzleとPrismaはどちらもORMに加えて製品を提供しています。Prisma Studioは、ユーザーがGUIを通じてデータベースと対話できるようにリリースされ、チーム内での使用のために限定的なセルフホスティングも可能です。Drizzle Studioも同じタスクを達成するためにリリースされました。

Prisma Studioに加えて、PrismaはPrisma Data Platformを介して商用製品を提供しています。

  • Prisma Accelerate: Prisma ORMと統合するコネクションプーラーおよびグローバルキャッシュです。ユーザーはすぐにコネクションプーリングの恩恵を受けられ、個々のクエリレベルでキャッシングを制御できます。
  • Prisma Optimize: 詳細な洞察、実用的な推奨事項を提供し、Prisma AIと連携してさらなる洞察とデータベースクエリの最適化を可能にするクエリ分析ツールです。

これらの製品はPrisma ORMと連携し、包括的なデータツールを提供することで、Data DXの原則に従ってデータ駆動型アプリケーションの構築を容易にします。

より安全な変更とバグの削減

Prismaは、データベースを扱う際の人為的ミスのリスクを最小限に抑えます。

  • フィールド名を変更しますか? Prismaがスキーマ、データベース、生成されたクライアントを更新します。自動的に同期されます。
  • リレーションシップを変更しますか? Prismaは安全なマイグレーションを生成し、完全な型安全性を介して正しさを強制します。

チームは、Prismaが正しさを強制し、物を壊さずに素早く作業を進めるのに役立つため、Prismaを選びます。

バッテリー同梱のエコシステム

DrizzleとPrisma ORMの両方には、ユーザーがライブラリで直接サポートされていないことを行いたいケースがあります。DrizzleはSQLの表現力に頼ってこれらのケースを回避する一方で、Prisma ORMはPrisma Client拡張機能を持っており、任意のユーザーが自身のPrisma Clientインスタンスに追加の動作を追加できるようにしています。これらの拡張機能は共有可能でもあり、チームがプロジェクト全体で利用するために、あるいは他のチームによって利用するために開発することができます。

Drizzleは比較的新しい製品ですが、Prisma ORMは2021年にリリースされ、JavaScript/TypeScript分野で確立されています。その価値は証明されており、多くの企業が本番環境でPrisma ORMを信頼しています。

Prisma ORMはまた、AmplicationWaspRedwoodJSKeystoneJSRemixt3 stackなど、多くのメタフレームワークや開発プラットフォームで推奨されるデータ層ツールとして含まれています。

その成熟度のおかげで、Prismaのコミュニティは様々なPrismaワークフローに役立つ多くの便利なツールを開発してきました。いくつかハイライトを紹介します。

Prismaは単なるORMではなく、完全な型安全なデータツールキットです。

  • Prisma Schema → マイグレーション、型、ドキュメント
  • Prisma Client → オートコンプリート、完全に型安全なクエリ
  • Prisma Studio → データを検査および編集するGUI
  • ネイティブ統合 → PlanetScale、Vercel、Cloudflare D1、Neonなど

データベースサポート

DrizzleとPrisma ORMはどちらも複数種類のデータベースをサポートしています。Drizzleは、既存のサードパーティデータベースドライバと統合される、Drizzleによって作成されたドライバ実装を通じてこのサポートを実現しています。

Prisma ORMはサードパーティのデータベースドライバのサポートを追加し始めましたが、主に組み込みドライバを使用して基盤となるデータベースと通信します。PrismaはデフォルトでTLS接続を使用し、セキュリティを向上させます。

さらに、Prisma ORMはDrizzleが現在サポートしていないCockroachDB、Microsoft SQL Server、MongoDBをサポートしています。Prisma ORMはまた、外部キー制約をサポートしていないデータベースエンジンに対してPrisma ORMがそれをエミュレートできるリレーションモードも提供しています。Drizzleは現在、Cloudflare D1、bun:sqlite、およびHTTPプロキシを介したSQLiteをサポートしていますが、Prisma ORMは現在これらをサポートしていません。

ベンチマーク

ORMを選択する際にパフォーマンスが重要な考慮事項であることを理解しています。様々なORMのパフォーマンスを比較するために、Vercelがホストするオープンソースのデータベースレイテンシベンチマークツールを使用できます。このツールを使用すると、様々なワークロードと構成下での様々なORMのレイテンシとスループットを評価できます。検討中のデータベースまたはデータベースプロバイダに対してベンチマークを実行することで、それらの相対的なパフォーマンス特性を明確に把握し、情報に基づいた意思決定に役立てることができます。

または、Drizzleを含む人気のあるTypeScript ORMを比較するために構築したベンチマークツールの結果を確認することもできます。このベンチマークはオープンソースであり、Node.jsおよびTypeScriptエコシステムにおけるデータベースプロバイダーとORMライブラリ間のデータベースクエリレイテンシーの公平な比較を目的としています。

結論

はい、私たちは偏りがありますが、これはユーザーや顧客から聞いたことでもあります。

  • 「スキーマのずれが致命的だったので、DrizzleからPrismaに切り替えました。Prismaはただ動作します。」
  • 「Prismaのスキーマのおかげで、ジュニアデベロッパーを2時間でオンボードできました。Drizzleなら数日かかっていたでしょう。」
  • 「Prismaが私たちのデータベースを健全に保ってくれると信頼しています。チームの誰もPostgresのエキスパートである必要はありません。」
  • 「Prismaチームからのアップデートと新機能のペースは、まさに目を見張るものがあります。」

Drizzle ORMとPrisma ORMはどちらもデータアクセスとマイグレーションのためのツールです。DrizzleはSQLライクな構文の薄いラッパーであることに焦点を当てているのに対し、Prismaは便利で表現力豊かなAPIに焦点を当てています。その他の重要な違いとしては、Prisma ORMがMSSQLとMongoDBをサポートしていること、Prisma Client拡張機能による追加機能のサポート、追加のクラウド対応製品、そして堅牢なエコシステムが挙げられます。

一方、データベースの経験レベルが異なる開発者(フロントエンド、バックエンド、フルスタック)が混在するチームの場合、Prisma ORMはデータアクセスとデータベーススキーマの管理に対して包括的で習得しやすいアプローチを提供します。


Prismaとつながりましょう

Prismaの旅を続けるには、以下とつながりましょう。 私たちの活発なコミュニティ。情報収集し、参加し、他の開発者と協力しましょう。

  • Xでフォローする アナウンス、ライブイベント、役立つヒントをチェックしましょう。
  • Discordに参加する 質問したり、コミュニティと話したり、会話を通じて積極的にサポートを受けたりできます。
  • YouTubeでチャンネル登録する チュートリアル、デモ、配信を視聴できます。
  • GitHubで関わる リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしましょう。
皆様のご参加を心より歓迎し、コミュニティの一員となることを楽しみにしています!

© . All rights reserved.