コンテンツにスキップ

Prisma ORMを使用してD1をクエリする

Last reviewed: 6 months ago

Prisma ORMとは?

Prisma ORMは、直感的なデータモデル、自動マイグレーション、型安全性、オートコンプリートのおかげで、データベースを扱う際の開発者体験を新たなレベルに引き上げる次世代のJavaScriptおよびTypeScript ORMです。

Prisma ORMの詳細については、Prismaのドキュメントを参照してください。

Prisma ORMを使用してCloudflare WorkerからD1をクエリする

この例では、ゼロからD1データベースにアクセスするCloudflare Workerを設定してデプロイする方法を示します。

前提条件

1. Cloudflare Workerを作成する

ターミナルを開き、次のコマンドを実行してCloudflareのhello-worldテンプレートを使用してCloudflare Workerを作成します:

Terminal window
npm create cloudflare@latest prisma-d1-example -- --type hello-world

ターミナルで、プロジェクトに関連する一連の質問が表示されます:

  1. TypeScriptを使用することに対してyesと答えます。
  2. Workerをデプロイすることに対してyesと答えます。

Workerをデプロイすると、https://prisma-d1-example.USERNAME.workers.devでWorkerをプレビューできるようになり、ブラウザに「Hello World」と表示されます。

2. Prisma ORMを初期化する

Prisma ORMを設定するには、プロジェクトディレクトリに移動し、Prisma CLIをインストールします:

Terminal window
cd prisma-d1-example
npm install prisma --save-dev

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

Terminal window
npm install @prisma/client
npm install @prisma/adapter-d1

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

Terminal window
npx prisma init --datasource-provider sqlite

上記のコマンドは次のことを行います:

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

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

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

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

generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

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

このステップでは、D1データベースを設定します。D1データベースはCloudflareダッシュボードまたはwranglerを介して作成できます。このチュートリアルでは、wrangler CLIを使用します。

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

Terminal window
npx wrangler d1 create prisma-demo-db

ターミナルに次の出力が表示されるはずです:

✅ Successfully created DB 'prisma-demo-db' in region EEUR
Created your database using D1's new storage backend. The new storage backend is not yet recommended for production workloads, but backs up your data via
point-in-time restore.
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "prisma-demo-db"
database_id = "__YOUR_D1_DATABASE_ID__"

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

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

name = "prisma-d1-example"
main = "src/index.ts"
compatibility_date = "2024-03-20"
compatibility_flags = ["nodejs_compat"]
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "prisma-demo-db"
database_id = "__YOUR_D1_DATABASE_ID__"

__YOUR_D1_DATABASE_ID__は、D1インスタンスのデータベースIDに置き換える必要があります。ターミナル出力からこのIDを取得できなかった場合は、Cloudflareダッシュボードで見つけるか、ターミナルでnpx wrangler d1 info prisma-demo-dbを実行して確認できます。

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

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

Prisma MigrateはまだD1をサポートしていないため、prisma migrate devprisma db pushを使用してデフォルトのマイグレーションワークフローに従うことはできません。

ただし、D1にはmigration systemがあり、Prisma CLIはスキーマ変更のためのSQLステートメントを生成するツールを提供しています。次のステップでは、D1のマイグレーションシステムとPrisma CLIを使用して、データベースに対してマイグレーションを作成して実行します。

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

Terminal window
npx wrangler d1 migrations create prisma-demo-db create_user_table

新しいフォルダーmigrationsを作成することに対してyesと答えます。

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

migrations/
└── 0001_create_user_table.sql

次に、そのファイルにUserテーブルを作成するSQLステートメントを追加する必要があります。

schema.prismaファイルを開き、次のUserモデルをスキーマに追加します:

model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}

次に、ターミナルで次のコマンドを実行して、上記のUserモデルに相当するUserテーブルを作成するSQLステートメントを生成します:

Terminal window
npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script > migrations/0001_create_user_table.sql

これにより、前述のマイグレーションファイルに新しいUserテーブルを作成するSQLステートメントが保存されます。以下のようになります:

-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL,
"name" TEXT
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

emailに対するUNIQUE INDEXが作成されたのは、PrismaスキーマのUserモデルがそのemailフィールドに@unique属性を使用しているためです。

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

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

このチュートリアルでは、ローカルおよびリモート開発を行います。Workerをローカルでテストし、その後Workerをデプロイします。ターミナルを開き、両方のコマンドを実行します:

Terminal window
# ローカルデータベース用
npx wrangler d1 migrations apply prisma-demo-db --local
Terminal window
# リモートデータベース用
npx wrangler d1 migrations apply prisma-demo-db --remote

マイグレーションを適用することを確認するように求められたら、両方の時にYesを選択します。

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

Terminal window
# ローカルデータベース用
npx wrangler d1 execute prisma-demo-db --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('jane@prisma.io', 'Jane Doe (Local)');" --local
Terminal window
# リモートデータベース用
npx wrangler d1 execute prisma-demo-db --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('jane@prisma.io', 'Jane Doe (Remote)');" --remote

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

Prisma ORMを使用してWorkerからデータベースをクエリするには、次の手順を実行する必要があります:

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

src/index.tsを開き、全ての内容を次のように置き換えます:

import { PrismaClient } from "@prisma/client";
import { PrismaD1 } from "@prisma/adapter-d1";
export interface Env {
DB: D1Database;
}
export default {
async fetch(request, env, ctx): Promise<Response> {
const adapter = new PrismaD1(env.DB);
const prisma = new PrismaClient({ adapter });
const users = await prisma.user.findMany();
const result = JSON.stringify(users);
return new Response(result);
},
} satisfies ExportedHandler<Env>;

Workerを実行する前に、次のコマンドでPrisma Clientを生成します:

Terminal window
npx prisma generate

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

データベースクエリが設定され、Prisma Clientが生成されたので、Workerをローカルで実行します:

Terminal window
npm run dev

ブラウザを開いてhttp://localhost:8787にアクセスし、データベースクエリの結果を確認します:

[{ "id": 1, "email": "jane@prisma.io", "name": "Jane Doe (Local)" }]

7. Workerをデプロイする

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

Terminal window
npm run deploy

https://prisma-d1-example.USERNAME.workers.devでWorkerにアクセスします。ブラウザには、リモートD1データベースからクエリされた次のデータが表示されるはずです:

[{ "id": 1, "email": "jane@prisma.io", "name": "Jane Doe (Remote)" }]

このチュートリアルを完了することで、D1をデータベースとして使用し、Prisma ORMを介してクエリを実行するCloudflare Workerをデプロイしました。

関連リソース