メインコンテンツへスキップ

Cloudflare D1でPrisma ORMを使用する方法

10分

はじめに

このガイドでは、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プレビュー機能を追加し、datasourceprovidersqliteに設定します。prisma initでPrismaスキーマを初期化したばかりの場合は、以下のUserモデルも追加してください

schema.prisma
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に以下のバインディングを追加します

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 listnpx 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アカウントID
  • CLOUDFLARE_DATABASE_ID: D1データベース作成時に取得するデータベースのID。
  • CLOUDFLARE_D1_TOKEN: このAPIトークンは、Prisma ORMがD1インスタンスと直接通信するために使用されます。これを作成するには、以下の手順に従ってください
    1. https://dash.cloudflare.com/profile/api-tokensにアクセス
    2. 「トークンを作成」をクリック
    3. 「カスタムトークン」テンプレートをクリック
    4. テンプレートに入力: 認識しやすい名前を使用し、Account / D1 / Edit権限を追加してください。
    5. 「サマリーへ進む」をクリックし、次に「トークンを作成」をクリック。

これで、これらのシークレットをPrisma ORMで使用できるように保存できます。ローカル開発には.envファイルを推奨しますが、どのシークレットストアでも機能します。

.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からデータベースをクエリするには、以下が必要です

  1. DBバインディングをEnvインターフェースに追加します。(または、npx wrangler typesを実行して、別のファイルworker-configuration.d.tsにバインディングからEnv型を生成することもできます。)
  2. PrismaD1ドライバアダプターを使用してPrismaClientをインスタンス化します。
  3. Prisma Clientを使用してクエリを送信し、結果を返します。

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

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の旅を続けましょう 私たちの活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう

皆様のご参加を心よりお待ちしております!

© . All rights reserved.