Prisma ORMを使用してD1をクエリする
Prisma ORM ↗は、直感的なデータモデル、自動マイグレーション、型安全性、オートコンプリートのおかげで、データベースを扱う際の開発者体験を新たなレベルに引き上げる次世代のJavaScriptおよびTypeScript ORMです。
Prisma ORMの詳細については、Prismaのドキュメント ↗を参照してください。
この例では、ゼロからD1データベースにアクセスするCloudflare Workerを設定してデプロイする方法を示します。
Node.js↗とnpm↗がマシンにインストールされていること。- Cloudflareアカウント ↗を持っていること。
ターミナルを開き、次のコマンドを実行してCloudflareのhello-world ↗テンプレートを使用してCloudflare Workerを作成します:
npm create cloudflare@latest prisma-d1-example -- --type hello-worldターミナルで、プロジェクトに関連する一連の質問が表示されます:
- TypeScriptを使用することに対して
yesと答えます。 - Workerをデプロイすることに対して
yesと答えます。
Workerをデプロイすると、https://prisma-d1-example.USERNAME.workers.devでWorkerをプレビューできるようになり、ブラウザに「Hello World」と表示されます。
Prisma ORMを設定するには、プロジェクトディレクトリに移動し、Prisma CLIをインストールします:
cd prisma-d1-examplenpm install prisma --save-dev次に、Prisma ClientパッケージとD1用のドライバーアダプターをインストールします:
npm install @prisma/clientnpm install @prisma/adapter-d1最後に、次のコマンドを使用してPrisma ORMに必要なファイルをブートストラップします:
npx prisma init --datasource-provider sqlite上記のコマンドは次のことを行います:
- Prismaスキーマ ↗ファイルを含む
prismaという新しいディレクトリを作成します。 - Prisma CLIによって読み取られる環境変数を構成するために使用される
.envファイルを作成します。
このチュートリアルでは、Prisma ORMとD1の接続はbindingを介して行われるため、.envファイルは必要ありません。次のステップでは、このバインディングの設定方法を説明します。
現在プレビュー中のドライバーアダプター ↗機能を使用するため、generatorブロックのpreviewFeaturesフィールドを明示的に有効にする必要があります。
schema.prismaファイルを開き、generatorブロックを次のように調整します:
generator client { provider = "prisma-client-js" previewFeatures = ["driverAdapters"]}このステップでは、D1データベースを設定します。D1データベースはCloudflareダッシュボード ↗またはwranglerを介して作成できます。このチュートリアルでは、wrangler CLIを使用します。
ターミナルを開き、次のコマンドを実行します:
npx wrangler d1 create prisma-demo-dbターミナルに次の出力が表示されるはずです:
✅ Successfully created DB 'prisma-demo-db' in region EEURCreated your database using D1's new storage backend. The new storage backend is not yet recommended for production workloads, but backs up your data viapoint-in-time restore.
[[d1_databases]]binding = "DB" # i.e. available in your Worker on env.DBdatabase_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.DBdatabase_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にクエリを送信するために、データベース内にテーブルを作成します。
Prisma Migrate ↗はまだD1をサポートしていないため、prisma migrate devやprisma db pushを使用してデフォルトのマイグレーションワークフローに従うことはできません。
ただし、D1にはmigration systemがあり、Prisma CLIはスキーマ変更のためのSQLステートメントを生成するツールを提供しています。次のステップでは、D1のマイグレーションシステムとPrisma CLIを使用して、データベースに対してマイグレーションを作成して実行します。
まず、wranglerを使用して新しいマイグレーションを作成します:
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ステートメントを生成します:
npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script > migrations/0001_create_user_table.sqlこれにより、前述のマイグレーションファイルに新しいUserテーブルを作成するSQLステートメントが保存されます。以下のようになります:
-- CreateTableCREATE TABLE "User" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "email" TEXT NOT NULL, "name" TEXT);
-- CreateIndexCREATE 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をデプロイします。ターミナルを開き、両方のコマンドを実行します:
# ローカルデータベース用npx wrangler d1 migrations apply prisma-demo-db --local# リモートデータベース用npx wrangler d1 migrations apply prisma-demo-db --remoteマイグレーションを適用することを確認するように求められたら、両方の時にYesを選択します。
次に、Workerが実行されるときにクエリできるデータを作成します。今回は、ファイルに保存せずにSQLステートメントを実行します:
# ローカルデータベース用npx wrangler d1 execute prisma-demo-db --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES('jane@prisma.io', 'Jane Doe (Local)');" --local# リモートデータベース用npx wrangler d1 execute prisma-demo-db --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES('jane@prisma.io', 'Jane Doe (Remote)');" --remotePrisma ORMを使用してWorkerからデータベースをクエリするには、次の手順を実行する必要があります:
EnvインターフェースにDBを追加します。PrismaD1ドライバーアダプターを使用してPrismaClientをインスタンス化します。- 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を生成します:
npx prisma generateデータベースクエリが設定され、Prisma Clientが生成されたので、Workerをローカルで実行します:
npm run devブラウザを開いてhttp://localhost:8787 ↗にアクセスし、データベースクエリの結果を確認します:
[{ "id": 1, "email": "jane@prisma.io", "name": "Jane Doe (Local)" }]Workerをデプロイするには、次のコマンドを実行します:
npm run deployhttps://prisma-d1-example.USERNAME.workers.devでWorkerにアクセスします。ブラウザには、リモートD1データベースからクエリされた次のデータが表示されるはずです:
[{ "id": 1, "email": "jane@prisma.io", "name": "Jane Doe (Remote)" }]このチュートリアルを完了することで、D1をデータベースとして使用し、Prisma ORMを介してクエリを実行するCloudflare Workerをデプロイしました。
- Prismaのドキュメント ↗。
- ヘルプが必要な場合は、新しいGitHubディスカッション ↗を開くか、PrismaドキュメントのAIボットに質問 ↗してください。
- Prisma ORMを使用した実行可能な例 ↗。
- Prismaコミュニティ ↗をチェックし、XでPrismaをフォロー ↗し、Prisma Discordに参加 ↗してください。
- 開発者体験の再定義:PrismaとCloudflareがデータDXへの道を切り開く ↗。