2023年10月6日

Prisma ORM におけるサーバーレスデータベースドライバーのプレビューサポート開始

Prisma は、Neon および PlanetScale のサーバーレスデータベースドライバーのプレビューサポートをリリースしました。この機能により、Prisma ユーザーは、長期間の TCP 接続なしに、データベースとの通信に既存のデータベースドライバーを活用できます。

Support for Serverless Database Drivers in Prisma ORM Is Now in Preview

サーバーレスデータベースドライバーとは?

従来、データベースドライバーは、通信のためにデータベースとの長期間の TCP 接続を確立していました。TCP 接続は開始時に多少のオーバーヘッドがありますが、継続的な通信にはほとんどオーバーヘッドがないため、サーバーフルなデプロイメントに最適です。

ただし、長期間の接続はサーバーレス環境で問題を引き起こす可能性があります。サーバーレス関数のエフェメラル(一時的)な性質を考えると、接続の追跡、アイドル状態の接続のクローズ、ゾンビの処理、およびデータベースが過負荷にならないように内部接続プールを維持することは面倒になる可能性があります。さらに、クラウドプロバイダーの数が増加しており、任意の TCP 接続を許可しないため、TCP 接続に依存する既存のデータベースの使用が困難になっています。

Using a traditional database with serverless functions can quickly lead to an overwhelmed database.

サーバーレス関数はデータベース接続をすぐに使い果たしてしまう可能性があります

上記の問題への対応として、Prisma はサーバーレス関数で実行されるアプリのエクスペリエンスを向上させるために Prisma Accelerate を開発しました。さらに、いくつかのデータベースプロバイダーも独自のデータベースドライバーライブラリを開発しました。これらのドライバーは、従来の TCP 接続ではなく、HTTP や WebSocket などの異なるプロトコルを使用しており、急速に進化しているサーバーレスに最適です。

では、これらのサーバーレスドライバーは Prisma にどのように適合するのでしょうか?

Prisma ORM がサーバーレスドライバーをサポート

最初のリリース以来、Prisma ORM の重要な部分はクエリエンジンでした。Rust で記述されたクエリエンジンにより、Prisma Client クエリを信頼性と効率性をもって SQL ステートメントに変換し、付属のデータベースドライバーを介して実行できます。このシステムは過去にうまく機能していましたが、数か月前に、新しいデータベースプロバイダーが JavaScript で記述されたサーバーレスデータベースドライバーを提供し、HTTP 経由で特別なエンドポイントと通信するというトレンドに気づきました。私たちのチームは、これらの新しいエンドポイントと通信する Rust ベースの実装を構築することは、大規模な取り組みになることを認識していました。

A diagram showing Prisma Client using Prisma's Query Engine to open long-lived TCP connections to a database

ドライバーアダプターなしでデータベースと通信する Prisma Client。

また、Prisma ORM は多くのデータベースエンジンとプロバイダーで動作しますが、これらのデータベースへの接続は、直接 TCP 接続、または Prisma Accelerate などの接続プーラーを介してのみ可能でした。今日、これらの問題は両方とも、ドライバーアダプターの導入によって解決されました。ドライバーアダプターにより、Prisma ORM は、サポートされているデータベースに接続する際に、既存の JavaScript データベースドライバーを使用できるようになります。

本日、2 つのドライバーアダプター、@prisma/adapter-neon@prisma/adapter-planetscale をリリースします。これらのアダプターは、Prisma Client と JavaScript サーバーレスデータベースドライバー間の翻訳者として機能します。データベースドライバーとドライバーアダプターを使用している場合、アプリが機能するためにデータベースへの直接 TCP 接続は不要になり、代わりに HTTP または WebSocket 接続経由でデータベースと通信します。Prisma は Rust エンジンを使用して Prisma Client クエリを SQL に変換し、これらのドライバーを介してこれらのクエリを実行します。このセットアップにより、実績のあるクエリエンジンと、Prisma を利用したコードベースでますます多くのプロバイダーを使用できる機能という、両方の長所を提供できます。

A diagram showing Prisma Client using Prisma's Query Engine translate queries but a separate database driver to communicate.

ドライバーアダプターとサーバーレスデータベースドライバーを使用してデータベースと通信する Prisma Client。

現在、唯一の要件は、HTTP または WebSocket リクエストを行う機能であり、Function-as-a-Service (FaaS) デプロイメントを大幅に簡素化します。

サーバーレスデータベースドライバーで Prisma ORM を使用する方法

Neon または PlanetScale サーバーレスデータベースドライバーで動作するように Prisma をセットアップするのは簡単です

  1. 通常どおりデータベースドライバーをセットアップします
  2. 対応する Prisma ドライバーアダプターに渡します
  3. そのドライバーアダプターで Prisma Client を作成します

まず、prisma@prisma/client をバージョン 5.4.1 以上にインストールします。dotenv もインストールして、.env ファイルで定義された環境変数が process.env 経由でスクリプトで利用できるようにします。

これで、以下のように Prisma Client をセットアップできます。

@neondatabase/serverless で Neon を使用する

The logo of neon.tech

Neon でデータベースを作成した後、@prisma/adapter-neon ドライバーアダプター、Neon のサーバーレスデータベースドライバー @neondatabase/serverless、および Neon で使用する WebSocket 接続をセットアップするための ws をインストールする必要があります。

次に、Neon データベース接続文字列.env ファイルにコピーされていることを確認してください。接続文字列は postgres:// で始まります。

これで、schema.prisma データソースでこの環境変数を参照できます。driverAdapters プレビュー機能も必ず含めてください。

次に、npx prisma generate を実行して Prisma Client を再生成し、プレビュー機能をアプリで利用できるようにします。

上記のセットアップ後、スクリプトで続行できます

  1. パッケージをインポート
  2. Neon サーバーレスデータベースドライバーをセットアップ
  3. Neon サーバーレスデータベースドライバーで Prisma Neon アダプターをインスタンス化
  4. ドライバーアダプターを Prisma Client インスタンスに渡します

これで、コードには WebSocket 接続や メッセージパイプラインなど、Neon サーバーレスドライバーの組み込みの利点があり、Prisma は接続の作成と破棄、エラー処理、およびタイプセーフをカバーします。Neon Serverless Driver のサポートに関するフィードバックがある場合は、専用の GitHub issue にコメントを残してください。今後の開発に役立てていきます。

@planetscale/database で PlanetScale を使用する

The logo of planetscale.com

PlanetScale の開始方法に従って開始したら、PlanetScale サーバーレスドライバーを使用してデータベースに接続できます。@prisma/adapter-planetscale ドライバーアダプター、@planetscale/database サーバーレスドライバー、および PlanetScale ドライバーに fetch 関数を提供するための undici をインストールする必要があります。

次に、PlanetScale データベース接続文字列.env ファイルにコピーされていることを確認してください。接続文字列は mysql:// で始まります。

これで、schema.prisma データソースでこの環境変数を参照できます。driverAdapters プレビュー機能も必ず含めてください。

次に、npx prisma generate を実行して Prisma Client を再生成し、プレビュー機能をアプリで利用できるようにします。

Prisma Client インスタンスは、PlanetScale の database-js を使用するようになり、これにより 接続の信頼性とパフォーマンスが向上します。Prisma の接続プールではなく HTTP リクエストを使用しますが、Prisma は引き続きエラー処理とタイプセーフを処理します。PlanetScale Serverless Driver のサポートに関するフィードバックがある場合は、専用の GitHub issue にコメントを残してください。今後の開発に役立てていきます。


データベースドライバーとドライバーアダプターのセットアップは既存の「はじめに」ガイドとは異なりますが、Prisma Client は非常に使い慣れたものになるでしょう。ただし、TCP 接続を使用せずに、選択したデータベースクライアントを利用してデータベースと通信する点が異なります。

まとめ

Prisma ユーザーが Neon および PlanetScale サーバーレスデータベースドライバーを利用できるようになったことを嬉しく思います。これらのドライバーは、サーバーレス環境や長期間の TCP 接続が不可能な領域に最適です。

Prisma Client と新しいドライバーアダプター機能は、現在、CloudFlare Workers や Vercel Edge Functions などの Edge Functions デプロイメントをサポートしていません。Edge Functions 環境で Neon または PlanetScale Serverless Driver をテストしたい場合は、アンケートにご回答ください。Edge function サポートの早期アクセスにご招待する対象として検討させていただきます。近日中に最新情報をお届けします。

ご意見をお聞かせください。driverAdapters プレビュー機能をお試しいただき、フィードバックがあれば、Neon および PlanetScale の GitHub ディスカッションまたは Discord でお寄せください。

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

Prisma ニュースレターにサインアップ