2024年4月2日

Prisma ORMとCloudflare D1(プレビュー)でエッジアプリケーションを構築

Cloudflareは、2017年のWorkersの導入以来、エッジコンピューティングの分野を開拓してきました。D1により、Cloudflareは最近、ネイティブのサーバーレスデータベースをリリースしました。Prisma ORMを使ってD1と対話できるようになることをお知らせできることを嬉しく思います!

Build Applications at the Edge with Prisma ORM & Cloudflare D1 (Preview)

D1でデータベースをエッジに

Cloudflare Workersのようなエッジ関数は、世界中に分散された軽量なサーバーレスコンピューティングの一種です。これにより、アプリケーションをエンドユーザーのできるだけ近くにデプロイして実行できます。

D1は、エッジ環境向けのCloudflareのネイティブなサーバーレスデータベースです。SQLiteをベースにしており、Cloudflareでアプリケーションをデプロイする際に使用できます。D1は2022年に最初にリリースされました

Cloudflare WorkerやD1データベースがどこで実行されるかを指定する必要はありません。それらは必要な場所ならどこでも実行されます。

D1: our quest to simplify databases (2022)D1: データベースを簡素化する私たちの探求 (2022) (Cloudflareブログより)

Cloudflareの地理的分散とコンピューティングおよびデータをアプリケーションユーザーに近づけるという原則に従い、D1は自動読み取りレプリケーションをサポートしています。これは、データベースがどれだけのクエリを受け取り、どこから受け取っているかに基づいて、データベースインスタンスの数と読み取り専用レプリカの場所を動的に管理します。

これにより、読み取りクエリは、クエリが発行された場所から最も近いD1インスタンスに対して実行されます。

Prisma ORMを他のデータベースプロバイダーと組み合わせて読み取りレプリカを使用することも可能ですが、通常はRead Replica Client拡張機能を使用する必要があります。D1を使用する場合、読み取りレプリカは専用のクライアント拡張機能なしで最初からサポートされています。

一方、書き込み操作の場合、変更をすべての読み取りレプリカに伝播させ、データの一貫性を確保するため、クエリは依然として単一のプライマリインスタンスに送信されます。

Prisma ORMがD1をサポート開始 🚀 (プレビュー)

Prismaでは、Cloudflareがアプリケーションの構築とデプロイの未来を築く最前線にいると信じています。

Data DXの改善におけるパートナーとしてのCloudflareについて、私たちの考え方については、このブログ記事で詳しく知ることができます: Developer Experience Redefined: Prisma & Cloudflare Lead the Way to Data DX

D1のサポートは、GitHub上でPrisma ORMに対する最も人気のある機能リクエストの1つでした。

テクノロジープロバイダーとしてのCloudflareを強く信じている当社は、Cloudflare Workers(およびPages)内でPrisma ORMを使用してD1データベースにアクセスできるようになったことをお知らせできることを嬉しく思います。

この機能は現在プレビュー版であるドライバーアダプターに基づいているため、D1サポートもプレビュー版であるとみなしています。

Prisma ORMとD1を始める

以下では、Prisma ORMを介してアクセスされるD1データベースを備えたCloudflare Workerを、完全にゼロからセットアップしデプロイするためのステップバイステップの指示を説明します。

このリリース時点では、Prisma MigrateはD1とまだ完全に互換性がありません。このチュートリアルでは、D1のマイグレーションシステムとprisma migrate diffコマンドを組み合わせてマイグレーションを生成および実行します。

前提条件

  • お使いのマシンにNode.jsとnpmがインストールされていること
  • Cloudflareアカウント

1. Cloudflare Workerを作成する

最初のステップとして、npm createを使用してCloudflare Workerのプレーンバージョンをブートストラップします(Cloudflareのhello-worldテンプレートを使用)。ターミナルで次のコマンドを実行します

これによりCLIウィザードが起動します。質問が表示されるたびにReturnキーを押して、すべての**デフォルト**オプションを選択します。

ウィザードの最後に、ブラウザに「Hello World」とシンプルに表示する、デプロイされたCloudflare Workerがドメインhttps://prisma-d1-example.USERNAME.workers.devに存在することになります。

2. Prisma ORMを初期化する

Workerが配置されたら、Prisma ORMをセットアップしましょう。

まず、プロジェクトディレクトリに移動してPrisma CLIをインストールします。

次に、Prisma ClientパッケージとD1用のドライバーアダプターをインストールします。

最後に、以下のコマンドを使用してPrisma ORMに必要なファイルをブートストラップします。

このコマンドは2つのことを実行しました。

  • Prismaスキーマファイルを含むprismaという新しいディレクトリを作成しました。
  • 通常、Prisma CLIによって読み取られる環境変数を設定するために使用される.envファイルを作成しました。

このチュートリアルでは、Prisma ORMとD1間の接続はバインディングを介して行われるため、.envファイルは必要ありません。このバインディングの設定手順は次のステップで説明します。

現在プレビュー版であるドライバーアダプター機能を使用するため、generatorブロックのpreviewFeaturesフィールドを介して明示的に有効にする必要があります。

schema.prismaファイルを開き、generatorブロックを次のように調整します。

3. D1データベースを作成する

このステップでは、D1データベースをセットアップします。これには一般的に2つのアプローチがあります。CloudflareダッシュボードUIを使用するか、wrangler CLIを使用する方法です。このチュートリアルではCLIを使用します。

ターミナルを開き、次のコマンドを実行します。

すべてがうまくいけば、次のような出力が表示されるはずです。

これで、CloudflareアカウントにCloudflare Workerへのバインディングを持つD1データベースが作成されました。

コマンド出力の最後の部分をコピーして、wrangler.tomlファイルに貼り付けます。次のような表示になるはずです。

上記のコードスニペットにある__YOUR_D1_DATABASE_ID__は、ご自身のD1インスタンスのデータベースIDに置き換える必要があるプレースホルダーであることに注意してください。このIDをターミナル出力から取得できなかった場合は、Cloudflareダッシュボードでも、またはターミナルでnpx wrangler d1 info prisma-demo-dbを実行することでも見つけることができます。

次に、Prisma ORMを使用してD1にクエリを送信できるように、データベースにデータベーステーブルを作成します。

4. データベースにテーブルを作成する

D1には、wrangler d1 migrateコマンドを介した独自のマイグレーションシステムが付属しています。このマイグレーションシステムは、スキーマ変更用のSQLステートメントを生成するツールを提供するPrisma CLIとうまく連携します。したがって、次のことができます。

  • D1のネイティブマイグレーションシステムを使用して、D1インスタンスにマイグレーションファイルを作成および適用する
  • Prisma CLIを使用して、スキーマ変更用のSQLステートメントを生成する

以下では、D1のマイグレーションシステムとPrisma CLIの両方を使用して、データベースに対してマイグレーションを作成および実行します。

まず、wrangler CLIを使用して新しいマイグレーションを作成します。

コマンドがmigrationsという新しいフォルダを作成できるか尋ねられたら、Returnキーを押して確認します。

このコマンドは、migrationsという新しいディレクトリと、その中に0001_create_user_table.sqlという空のファイルを作成しました。

次に、Userテーブルを作成するSQLステートメントをそのファイルに追加する必要があります。schema.prismaファイルを開き、以下のUserモデルを追加します。

次に、上記のUserモデルと同等のUserテーブルを作成するSQLステートメントを生成するために、ターミナルで次のコマンドを実行します。

これにより、以前のマイグレーションファイルmigrations/0001_ceate_user_table.sqlに新しいUserテーブルを作成するSQLステートメントが保存されます。内容は次のとおりです。

次に、wrangler d1 migrations applyコマンドを使用して、このSQLステートメントをD1に送信する必要があります。このコマンドは2つのオプションを受け入れます。

  • --local: D1の**ローカル**バージョンに対してステートメントを実行します。このD1のローカルバージョンは、プロジェクトの.wrangler/stateディレクトリに配置されるSQLiteデータベースファイルです。このアプローチは、ローカルマシンでWorkerを開発およびテストしたい場合に役立ちます。詳細については、Cloudflareドキュメントを参照してください。
  • --remote: D1の**リモート**バージョンに対してステートメントを実行します。このバージョンは、デプロイされたCloudflare Workersによって使用されます。詳細については、Cloudflareドキュメントを参照してください。

このチュートリアルでは、両方を行います。Workerをローカルでテストし、その後デプロイします。したがって、両方のコマンドを実行する必要があります。ターミナルを開き、次のコマンドを貼り付けます。

まず、**ローカル**データベースに対してスキーマ変更を実行します。

次に、**リモート**データベースに対して。

マイグレーションを適用するかどうかの確認を求められたら、両方ともReturnキーを押します。

これで、ローカルおよびリモートの両方のD1インスタンスにUserテーブルが含まれるようになりました。

Workerが実行されたらクエリできるダミーデータも作成しましょう。今回は、SQLステートメントをファイルに保存せずに実行します。

再度、まず**ローカル**データベースに対してコマンドを実行します。

最後に、**リモート**データベースに対して実行します。

これで、ローカルとリモートの両方のデータベースインスタンスにダミーレコードが作成されました。ローカルのSQLiteファイルは.wrangler/stateにあり、リモートのファイルはCloudflareダッシュボードで確認できます。

5. Workerからデータベースをクエリする

Prisma ORMを使用してWorkerからデータベースをクエリするには、次の操作が必要です。

  1. EnvインターフェースにDBを追加します。
  2. PrismaD1ドライバーアダプターを使用してPrismaClientをインスタンス化します。
  3. Prisma Clientを使用してクエリを送信し、結果を返します。

src/index.tsを開き、内容全体を以下に置き換えます。

Workerを実行する前に、次のコマンドでPrisma Clientを生成する必要があります。

6. Workerをローカルで実行する

データベースクエリが配置され、Prisma Clientが生成されたら、Workerをローカルで実行できます。

これで、ブラウザでhttps://:8787を開くと、データベースクエリの結果を確認できます。

7. Workerをデプロイする

Workerをデプロイするには、次のコマンドを実行します。

以前と同様に、デプロイされたWorkerはhttps://prisma-d1-example.USERNAME.workers.devを介してアクセスできます。ブラウザでそのURLに移動すると、リモートのD1データベースからクエリされた以下のデータが表示されるはずです。

おめでとうございます!D1をデータベースとして使用し、Prisma ORMを介してクエリを実行するCloudflare Workerをデプロイしました🎉

今すぐ試す

Prisma ORMでの新しいD1サポートについて、皆様のご意見をお聞かせください!ぜひお試しいただき、GitHubまたはDiscordでフィードバックをお寄せください。Happy coding ✌️

次回の記事をお見逃しなく!

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

© . All rights reserved.