コンテンツへスキップ

Cloudflare Workers で Prisma を使用する方法

Cloudflare Workers で Prisma を使用する方法は2つあります。Prisma Accelerate を使用する方法と、Driver Adapter を使用する方法です。

Prisma Accelerate の使用

Prisma のインストール

Hono Cloudflare Workers に Prisma をインストールします。ここでは、PostgreSQL データベースとして neon.tech の無料プランを使用していますが、プロジェクトに適したデータベースを使用できます。

neon.tech にアクセスして、PostgreSQL データベースを無料で作成します。

bash
npm i prisma --save-dev
npx prisma init

Prisma Accelerate の設定

Accelerate を設定するには、Prisma Accelerate にアクセスして、ログインまたは無料で登録します。

ログイン後、新しい Accelerate プロジェクトを作成できるページに移動します。

Accelerate Page

「新規プロジェクト」ボタンをクリックして、プロジェクト名を入力します。

Accelerate Page

その後、下記のようなページが表示されます。

Accelerate Edit Page

「Accelerate を有効化」ボタンをクリックすると、次のページが表示されます。

Enable Page

neon.tech データベースの接続文字列を「データベース接続文字列」フィールドに貼り付け、リージョンを選択して、「Accelerate を有効化」ボタンをクリックします。

次のようなものが表示されます。

API Key

「APIキーを生成」をクリックすると、下記のような新しいAPIキーを受け取ります。

bash
DATABASE_URL="prisma://accelerate...."

この `DATABASE_URL` をコピーし、` .dev.vars` と ` .env` に保存して、後で prisma cli がアクセスできるようにします。

プロジェクトでの Prisma の設定

受け取った neon.tech のURLは代替として使用することもでき、Prisma により多くのオプションを提供するため、後で使用するように保存してください。

bash
DATABASE_URL="your_prisma_accelerate_url"
DIRECT_URL="your_neon_tech_url

次に、`schema.prisma` ファイルに移動し、次のようにURLを設定します。

ts
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
}

プロジェクトで後で使えるような、このような関数を作成します。

ts
import { PrismaClient } from '@prisma/client/edge'
import { withAccelerate } from '@prisma/extension-accelerate'

export const getPrisma = (database_url: string) => {
  const prisma = new PrismaClient({
    datasourceUrl: database_url,
  }).$extends(withAccelerate())
  return prisma
}

プロジェクトでこの関数を使用する例を次に示します。

ts
import { Hono } from 'hono'
import { sign, verify } from 'hono/jwt'
import { getPrisma } from '../usefulFun/prismaFun'

// Create the main Hono app
const app = new Hono<{
  Bindings: {
    DATABASE_URL: string
    JWT_SECRET: string
  }
  Variables: {
    userId: string
  }
}>()

app.post('/', async (c) => {
  // Now you can use it wherever you want
  const prisma = getPrisma(c.env.DATABASE_URL)
})

Prisma Driver Adapter の使用

Prisma は、`driverAdapters` を介して D1 データベースで使用できます。前提条件は、Prisma をインストールし、Wrangler を統合して Hono プロジェクトにバインドすることです。これは、Hono、Prisma、および D1 Cloudflare のすべてのドキュメントが分離されており、正確で精密な手順ごとの指示がないため、サンプルプロジェクトです。

Prisma の設定

Prisma と D1 は、アダプターとの接続を保護するために Wrangler でバインディングを使用しています。

bash
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1

その後、Prisma はデータベースのスキーマを生成します。`prisma/schema.prisma` で単純なモデルを定義します。アダプターを変更することを忘れないでください。

prisma/schema.prisma
ts
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["driverAdapters"] // change from default
}

datasource db {
  provider = "sqlite" // d1 is sql base database
  url      = env("DATABASE_URL")
}

// Create a simple model database
model User {
  id    String @id  @default(uuid())
  email String  @unique
  name  String?
}

D1 データベース

既に D1 データベースの準備ができている場合は、この手順をスキップしてください。準備ができていない場合は、こちらにあるリソースを作成してください。

bash
npx wrangler d1 create __DATABASE_NAME__ // change it with yours

`wrangler.toml` で DB がバインドされていることを確認してください。

wrangler.toml
toml
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "__DATABASE_NAME__"
database_id = "DATABASE ID"

Prisma Migrate

このコマンドは、Prisma を移行し、ローカルまたはリモートの D1 データベースに変更します。

bash
npx wrangler d1 migrations create __DATABASE_NAME__ create_user_table # will generate migration folder and sql file

// for generate sql statement

npx prisma migrate diff \
  --from-empty \
  --to-schema-datamodel ./prisma/schema.prisma \
  --script \
  --output migrations/0001_create_user_table.sql

データベースモデルを D1 に移行します。

bash
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generate

Prisma クライアントの設定

D1 データベースを使用して Prisma からデータベースをクエリするには、次のように型を追加する必要があります。

bash
npx wrangler types

`worker-configuration.d.ts` ファイルが生成されます。

Prisma クライアント

Prisma をグローバルに使用するには、次のようなコードを含む `lib/prismaClient.ts` ファイルを作成します。

ts
import { PrismaClient } from '@prisma/client'
import { PrismaD1 } from '@prisma/adapter-d1'

const prismaClients = {
  async fetch(db: D1Database) {
    const adapter = new PrismaD1(db)
    const prisma = new PrismaClient({ adapter })
    return prisma
  },
}

export default prismaClients

Wrangler 環境変数と Hono のバインディング

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}

const app = new Hono<{ Bindings: Bindings }>() // binding env value

Hono ルートでの使用例

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}
const app = new Hono<{ Bindings: Bindings }>()

app.get('/', async (c) => {
  const prisma = await prismaClients.fetch(c.env.DB)
  const users = await prisma.user.findMany()
  console.log('users', users)
  return c.json(users)
})

export default app

これにより、Postman または Client Thunder を使用して結果を確認するルート `/` にすべてのユーザーが返されます。

MIT ライセンスの下でリリースされています。