2025年1月30日

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

Rustで書かれたPrismaクエリエンジンは、常にPrisma ORMの中核を成す部分でした。将来のために開発されましたが、Prisma ORMの現在の方向性とは互換性がありません。RustからTypeScriptへのリライトについて、詳細をご覧ください。

From Rust to TypeScript: A New Chapter for Prisma ORM

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コンパイラに渡し、それがクエリプランを返します。このプランは、その後完全に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の体験は引き続き親しみやすく、直感的であり続けるでしょう

未来の機会を解き放つ

この移行は現在の課題に対処するだけでなく、イノベーションの新たな機会を生み出します。実際、クエリコンパイラは、私たちのチームとコミュニティが探求できる多くの可能性を秘めています。例えば、パラメータ化されたクエリプランを使用することで、実行速度を向上させるためにクエリプランを再利用のために保存することが可能になります。別の方法としては、初期クエリプランをコンパイル時に構築し、ランタイムの計算要件をさらに削減することが挙げられます。

これらの可能性に興奮しており、皆さんのご意見を伺うのを楽しみにしております!GitHubまたはDiscordで議論にご参加ください。

より良いPrisma ORM体験の構築にご協力ください

このプロジェクトは、Prisma ORMを誰もにとってより良くするための重要な一歩です。Prisma ORMは本質的に、あなたのような開発者のために作られています。あなたのフィードバックと協力は、この道のりにおいて非常に重要です。

ご協力いただける方法はこちらです

最後に、アーリーアクセス版クライアントをテストしてください!GitHubとDiscordで最新情報を共有します。

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

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

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

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

© . All rights reserved.