Cloudflare D1でPrisma ORMを使用する方法
はじめに
このガイドでは、Prisma ORMをCloudflareのエッジネットワークで動作するサーバーレスSQLデータベースであるCloudflare D1で使用する方法を説明します。Prisma ORMをD1でセットアップし、マイグレーションを処理し、アプリケーションをCloudflare Workersにデプロイする方法を学習します。デプロイ可能なサンプルはGitHubで確認できます。
前提条件
このガイドを始める前に、以下が準備されていることを確認してください
- Cloudflareアカウント
- Node.jsがインストールされていること(バージョン18以上)
- Wrangler CLIがインストールされていること(バージョン3.39.0以上)
- Cloudflare WorkersとD1の基本的な知識
1. Prismaスキーマの設定
Prismaスキーマに、generator
ブロックにdriverAdapters
プレビュー機能を追加し、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データベース接続のセットアップ
Workersを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
:npx wrangler whoami
で取得するCloudflareアカウントIDCLOUDFLARE_DATABASE_ID
: D1データベース作成時に取得するデータベースのID。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'),
migrate: {
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が稼働したらクエリできるダミーデータも作成しましょう。今回は、SQLステートメントをファイルに保存せずにwranglerを使って実行します
# 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の実装
WorkerにPrisma Clientクエリを追加する前に、以下のコマンドで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
これでブラウザをhttps://: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)' }]
次のステップ
Cloudflare D1でPrisma ORMをセットアップしたので、以下を行うことができます
- Prismaの強力なクエリAPIを使用して、より複雑なクエリを追加する
- データベース管理のためにPrisma Studioをセットアップする
- データベース監視を実装する
- 自動テストを追加する
詳細については
Prismaとつながり続ける
以下の方法でつながり、Prismaの旅を続けましょう 私たちの活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう
- Xでフォローしてください お知らせ、ライブイベント、役立つヒントを配信します。
- Discordに参加してください 質問したり、コミュニティと話したり、会話を通じて積極的なサポートを受けたりできます。
- YouTubeで購読してください チュートリアル、デモ、ストリームを配信します。
- GitHubで参加してください リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしてください。