2025年1月30日

RustからTypeScriptへ: Prisma ORMの新たな章

Rustで記述されたPrismaクエリエンジンは、常にPrisma ORMの中核部分でした。将来を見据えて開発されましたが、Prisma ORMの現在の方向性とは互換性がなくなりました。RustからTypeScriptへの書き換えの詳細については、以下をお読みください。

Prismaが今何をしているって?!

最近公開されたORMマニフェストで、今後の数ヶ月から数年でPrisma ORMがどのように管理されるかを説明しました。その中で、小さな情報として以下の記述が含まれていました。

PrismaのコアロジックをRustからTypeScriptに移行し、ORMを再設計して、カスタマイズと拡張を容易にすることで、この問題に対処しています。

これは投稿の中のほんの一文に過ぎなかったかもしれませんが、非常に多くの反響がありました。

たとえば、Theo氏のこのビデオは本当に気に入りました。

全体的に、これらは非常に合理的な反応です。Rustクエリエンジンは、Prisma ORMの初期から存在していました。オンラインで見られた議論は素晴らしいものでしたが、TypeScript実装が早期アクセスに近づいているため、私たちも参加して最新情報を提供したいと考えました。

手短に言えば、コミュニティのすべての人に、何が変わり、それらの変更の背後にある動機、そしてそれらの変更がどのように実装されるかを知っていただきたいのです。

なぜPrismaはRustを選んだのか?

Prisma ORMの将来を探る前に、Prisma ORMがRustエンジンを使用している理由を理解する必要があります。Prisma 2(現在のPrisma ORM)の計画を始めたとき、私たちは非常に明確なビジョンを持っていました。それは、TypeScript、Go、Python、Scala、Rustなど、できるだけ多くの言語向けにORMを構築したいということでした。新しい言語のサポートを比較的簡単に追加できるソリューションが必要でした。Rustのパフォーマンス上の利点とシステムレベルのアプローチは、このコアクエリエンジンにとって自然な選択でした。

この決定は、GraphCoolとPrisma 1で行われた作業の継続でもありました。これらの初期ソリューションのコアとなるデプロイ可能なインフラストラクチャは、Rustベースのクエリエンジン(SQLクエリの生成、接続プールの管理、データベースからの結果の返却という重労働を処理するように設計されたバイナリ)へと進化しました。これにより、prisma-client-jsのような言語固有のクライアントは、エンジンの上に軽量なレイヤーとして残ることができました。

なぜRustから離れるのか?

強力なRustエンジンのおかげで、優れたパフォーマンスを迅速に提供できましたが、それ以降、いくつかの注目すべき課題があることがわかりました。

  • スキルセットの壁: クエリエンジンへの貢献には、RustとTypeScriptの両方の習熟度が必要であり、コミュニティの関与の機会が減少します。
  • デプロイの複雑さ: 各オペレーティングシステムとOpenSSLライブラリのバージョンには独自のバイナリが必要なため、デプロイが複雑になり、開発が遅くなります。
  • 互換性の問題: 最新のJavaScriptランタイム、サーバーレス、エッジ環境は、必ずしも大規模なRustバイナリと互換性があるとは限らず、Prismaをデプロイできる方法と場所が制限されます。

さらに、クエリエンジンのコアな利点である複数のクライアントのサポートは、もはや私たちの焦点ではありません。Prisma ORMはTypeScriptプロジェクトであり、コミュニティクライアントをサポートしていますが、社内で開発することはありません。

これらの点を考慮に入れ、包括的でコミュニティ主導のエコシステムを構築するという私たちのコミットメント(ORMマニフェストで概説されているように)を追加した結果、可能な限り多くの部分をRustクエリエンジンからTypeScriptに移行するという結論に至りました。これにより、Prisma ORMユーザーが知って愛する開発者エクスペリエンスを犠牲にすることなく、貢献を簡素化し、デプロイの頭痛の種を軽減できます。

クエリ実行の再定義

早期アクセスで導入する主要なアーキテクチャ変更には、クエリ実行とデータベース結果の処理をRustからTypeScriptに移行することが含まれます。

この変更を理解するために、現在のクエリエンジンのセットアップを確認しましょう。

今日のPrisma ORMクエリの実行

現在、Prisma ORMでデータベースにクエリを実行する方法は2つあります。

  • Rustで記述されたデータベースドライバーを使用する。
  • ドライバーアダプターTypeScriptで記述されたドライバーの両方を使用する。

最初のアプローチでは、Prisma ORMクエリはRustで記述されたクエリエンジンに渡されます。このエンジンは、クエリプランの構築からクエリの実行、JavaScriptクライアントへの結果の返却まで、すべてを管理します。

Prisma ORM communicating with a database

ただし、このアーキテクチャは、D1やTursoなど、JavaScriptドライバーのみを提供するデータベースをサポートできません。この制限に対処するために、ドライバーアダプターを導入しました。

ドライバーアダプターを使用する場合でも、クエリエンジンはクエリプランを開発し、SQLステートメントを生成します。ただし、実行はドライバーアダプターを介してデータベースに委任されます。

Prisma ORM communicating with a database via a driver adapter.

このアプローチにより、JavaScriptドライバーとの互換性が実現しますが、トレードオフが発生します。データはJavaScriptからRustにシリアル化され、次にJavaScriptに戻す必要があるため、効率が低下し、この方法の利点の一部が打ち消されます。

明日のPrisma ORMクエリの実行

新しいアーキテクチャでは、ドライバーアダプターは引き続き使用されます。ただし、Rustベースのクエリエンジンに依存する代わりに、Prisma ORMはクエリをWASMコンパイラーに渡し、WASMコンパイラーがクエリプランを返します。このプランは、完全にTypeScriptで実行されます

Prisma ORM communicating with a database in the query compiler project

この簡素化されたアーキテクチャは、いくつかの即時の利点をもたらします。

  • 実績のあるJavaScriptデータベースドライバーのサポートを維持します。
  • JavaScriptとRust間のデータ変換の必要性を減らします。
  • RustとJavaScript間で転送されるデータ量を最小限に抑えます。
  • 外部バイナリを同梱する必要がなくなります。クエリコンパイラーがシステム固有のユーティリティに依存しなくなるためです。

クエリ実行をTypeScriptに移行することで、アーキテクチャを合理化し、開発者の互換性とパフォーマンスを向上させます。

合理化されたエクスペリエンスが近日公開

言語をまたいだロジックの移行は大きな変革ですが、混乱を最小限に抑えるために段階的に進めています。これらの変更は大幅なものですが、私たちの優先事項は、Prismaに期待されるシンプルさと信頼性を維持するスムーズな移行を保証することです。この移行では、今日の課題に対処するだけでなく、強化された開発者エクスペリエンスの基盤を築いています。

スムーズな移行に向けたステップ

私たちのエンジニアリングチームは、クエリエンジンのロジックをTypeScript側のコードベースに段階的に移行しています。まだ移行できないコンポーネントは、@prisma/client npmモジュールに含まれるWASMファイルに再パッケージ化されています。このWASMファイルはクエリコンパイラーとして機能し、APIの大幅な変更なしにワークフローを簡素化します。

たとえば、binaryTargetsの要件を削除し、開発者エクスペリエンスをさらに合理化する予定です。全体として、Prisma ORMのエクスペリエンスは、これまでと変わらず直感的で使い慣れたものになります

未来の機会を解き放つ

この移行は、現在の課題に対処するだけでなく、イノベーションのための新たな機会を生み出します。実際、クエリコンパイラーは、私たちのチームとコミュニティが探求できる多くの可能性を可能にします。たとえば、パラメーター化されたクエリプランを使用すると、実行を高速化するためにクエリプランを再利用のために保存することができます。もう1つの道は、初期クエリプランをコンパイル時に構築し、ランタイム計算の必要性をさらに減らすことです。

これらの可能性に興奮しており、皆様のご意見をお待ちしています!GitHubまたはDiscordでディスカッションにご参加ください。

より良いPrisma ORMエクスペリエンスの構築にご協力ください

このプロジェクトは、Prisma ORMをすべての人にとってより良くするための重要なステップです。その中核として、Prisma ORMはあなたのような開発者向けに構築されています。皆様からのフィードバックと協力は、この旅に不可欠です。

ご協力いただける方法

最後に、早期アクセス版クライアントをお試しください!GitHubとDiscordで最新情報をお知らせします。

今はPrismaにとってエキサイティングな時期であり、今後さらに改善と機会が待っています。成長する私たちを刺激し、この旅に参加していただきありがとうございます。

新しい早期アクセス版クライアントをいち早く試してみたいですか?最新情報を入手するには、X(旧Twitter)をフォローし、Discordに参加してください。

次回の投稿をお見逃しなく!

Prismaニュースレターに登録する