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

Prisma ORM と Cloudflare D1 の使い方

10 分

はじめに

このガイドでは、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 機能を追記し、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 データベース接続を設定する

Worker を 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 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 インスタンスと直接通信するために使用されます。これを作成するには、以下の手順に従ってください。
    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'),
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 からデータベースをクエリするには、以下を行う必要があります

  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

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

皆様のご参加を心から歓迎し、コミュニティの一員としてお迎えできることを楽しみにしています!