Prisma ORM と Cloudflare D1 の使い方
はじめに
このガイドでは、Cloudflare のエッジネットワーク上で動作するサーバーレス SQL データベースである Cloudflare D1 で Prisma ORM を使用する方法を説明します。D1 で Prisma ORM をセットアップし、マイグレーションを処理し、アプリケーションを Cloudflare Workers にデプロイする方法を学びます。デプロイ準備完了のサンプルは GitHub で見つけることができます。
前提条件
このガイドを始める前に、以下が必要です
- Cloudflare アカウント
- Node.js がインストールされていること (バージョン 18 以上)
- Wrangler CLI がインストールされていること (バージョン 3.39.0 以上)
- Cloudflare Workers と D1 の基本的な知識
1. Prisma スキーマを設定する
Prisma スキーマで、generator
ブロックに driverAdapters
Preview 機能を追記し、datasource
の provider
を sqlite
に設定します。もし prisma init
で Prisma スキーマを初期化したばかりの場合は、以下の User
モデルも追加してください。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
2. 依存関係をインストールする
次に、必要なパッケージをインストールします。
npm install @prisma/adapter-d1
また、Wrangler CLI のバージョンが wrangler@^3.39.0
以上であることを確認してください。そうしないと、次のセクションで使用される --remote
フラグが利用できません。
3. D1 データベース接続を設定する
Worker を D1 インスタンスに接続するには、wrangler.toml
に次のバインディングを追加します。
name = "prisma-cloudflare-worker-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 = "__YOUR_D1_DATABASE_NAME__" # to be replaced
database_id = "__YOUR_D1_DATABASE_ID__" # to be replaced
上記のコードスニペットの __YOUR_D1_DATABASE_NAME__
と __YOUR_D1_DATABASE_ID__
はプレースホルダーであり、ご自身の D1 インスタンスのデータベース名と ID に置き換える必要があることに注意してください。
ターミナル出力からこの ID を取得できなかった場合は、Cloudflare ダッシュボードで確認するか、ターミナルで npx wrangler d1 list
および npx wrangler d1 info __YOUR_D1_DATABASE_NAME__
を実行して確認することもできます。
4. データベースマイグレーションを設定する
D1 内のデータをマイグレーションされた状態に保つために、prisma migrate
を使用することをお勧めします。ただし、Cloudflare のマイグレーションシステムを使用したい場合は、そのワークフローも利用可能です。
4.1 必要な環境変数を追加する
Prisma D1 アダプターを使用するには、いくつかのシークレットを .env
ファイルに追加する必要があります。
DATABASE_URL
: ローカル D1 インスタンスへのパス。通常は"file:./prisma/db.sqlite"
。CLOUDFLARE_ACCOUNT_ID
: Cloudflare アカウント ID。npx wrangler whoami
で取得します。CLOUDFLARE_DATABASE_ID
: データベースの ID。D1 データベース作成時に取得します。CLOUDFLARE_D1_TOKEN
: この API トークンは、Prisma ORM が D1 インスタンスと直接通信するために使用されます。これを作成するには、以下の手順に従ってください。- https://dash.cloudflare.com/profile/api-tokens にアクセスします
- 「トークンを作成」をクリックします
- 「カスタムトークン」テンプレートをクリックします
- テンプレートを入力します。認識しやすい名前を使用し、
Account / D1 / Edit
権限を追加してください。 - 「概要に進む」をクリックし、次に「トークンを作成」をクリックします。
これで、Prisma ORM で使用するこれらのシークレットを保存できます。ローカル開発には .env
ファイルをお勧めしますが、任意のシークレットストアを使用できます。
DATABASE_URL="file:./prisma/db.sqlite"
CLOUDFLARE_ACCOUNT_ID="0773..."
CLOUDFLARE_DATABASE_ID="01f30366-..."
CLOUDFLARE_D1_TOKEN="F8Cg..."
4.2 Prisma Config を設定する
プロジェクトのルートにマイグレーションドライバアダプターが定義された prisma.config.ts
ファイルが設定されていることを確認してください。
import path from 'node:path'
import type { PrismaConfig } from 'prisma'
import { PrismaD1HTTP } from '@prisma/adapter-d1'
// import your .env file
import 'dotenv/config'
type Env = {
CLOUDFLARE_D1_TOKEN: string
CLOUDFLARE_ACCOUNT_ID: string
CLOUDFLARE_DATABASE_ID: string
}
export default {
earlyAccess: true,
schema: path.join('prisma', 'schema.prisma'),
migration: {
async adapter(env) {
return new PrismaD1HTTP({
CLOUDFLARE_D1_TOKEN: env.CLOUDFLARE_D1_TOKEN,
CLOUDFLARE_ACCOUNT_ID: env.CLOUDFLARE_ACCOUNT_ID,
CLOUDFLARE_DATABASE_ID: env.CLOUDFLARE_DATABASE_ID,
})
},
},
} satisfies PrismaConfig<Env>
これにより、prisma migrate
が D1 データベースと対話できるようになります。
4.3 初めてのマイグレーションを実行する
prisma migrate dev
を実行して、データベースをローカルスキーマに合わせてマイグレーションできます
npx prisma migrate dev --name init
Worker が実行されたらクエリできるダミーデータも作成しましょう。今回は、wrangler を使用して、SQL ステートメントをファイルに保存せずに実行します。
# For the local database
npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('jane@prisma.io', 'Jane Doe (Local)');" --local
# For the remote database
npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('jane@prisma.io', 'Jane Doe (Remote)');" --remote
5. Worker を実装する
Prisma Client クエリを Worker に追加する前に、次のコマンドで Prisma Client を生成する必要があります
npx prisma generate
Prisma ORM を使用して Worker からデータベースをクエリするには、以下を行う必要があります
DB
バインディングをEnv
インターフェースに追加します。(または、npx wrangler types
を実行して、worker-configuration.d.ts
という別のファイルにバインディングからEnv
タイプを生成することもできます。)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: Request,
env: Env,
ctx: ExecutionContext
): 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)
},
}
6. Worker をローカルで実行する
データベースクエリが配置され、Prisma Client が生成されたので、Worker をローカルで実行できます
npm run dev
これで、ブラウザで http://localhost:8787
を開いて、データベースクエリの結果を確認できます
;[{ id: 1, email: 'jane@prisma.io', name: 'Jane Doe (Local)' }]
7. DATABASE_URL
環境変数を設定し、Worker をデプロイする
Worker をデプロイするには、次のコマンドを実行します
npm run deploy
デプロイされた Worker には、https://prisma-d1-example.USERNAME.workers.dev
からアクセスできます。ブラウザでその URL に移動すると、リモート D1 データベースからクエリされた次のデータが表示されるはずです
;[{ id: 1, email: 'jane@prisma.io', name: 'Jane Doe (Remote)' }]
次のステップ
Prisma ORM と Cloudflare D1 をセットアップしたので、以下を実行できます
- Prisma の強力なクエリ API を使用して、より複雑なクエリを追加する
- データベース管理のために Prisma Studio をセットアップする
- データベース監視を実装する
- 自動テストを追加する
詳細情報
Prisma とつながる
以下とつながって、Prisma の旅を続けましょう 活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう
- X (旧Twitter) でフォローしてください お知らせ、ライブイベント、役立つヒントをお届けします。
- Discord に参加してください 質問をしたり、コミュニティと話したり、会話を通じて積極的なサポートを得ることができます。
- YouTube でチャンネル登録してください チュートリアル、デモ、ストリームを配信しています。
- GitHub で交流しましょう リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしてください。