本文へ移動

Cloudflare Workers で Prisma を使う ​

Prisma ORM は、データベース操作のためのモダンで堅牢なツールキットです。Hono と Cloudflare Workers と組み合わせることで、高性能なサーバーレスアプリケーションをエッジにデプロイできます。

このガイドでは、Hono で Prisma ORM を使う 2 つの方法を紹介します。

それぞれに利点があるため、プロジェクトの要件に合う方法を選べます。

Prisma Postgres を使う ​

Prisma Postgres は、ユニカーネル上に構築されたマネージドのサーバーレス PostgreSQL データベースです。コネクションプーリング、キャッシュ、クエリ最適化の提案などをサポートします。初期開発、テスト、個人プロジェクト向けに十分な無料枠が用意されています。

1. Prisma と必要な依存関係をインストールする ​

Hono プロジェクトに Prisma をインストールします。

bash
npm i prisma --save-dev

Prisma Postgres に必要な Prisma クライアント拡張をインストールします。

sh
npm i @prisma/extension-accelerate

Prisma Postgres のインスタンスを使って Prisma を初期化します。

bash
npx prisma@latest init --db

Prisma Data Platform のアカウントがまだない場合やログインしていない場合、コマンドは利用可能な認証プロバイダーでのログインを求めます。ブラウザーが開くので、ログインするかアカウントを作成してください。完了したら CLI に戻ります。

ログイン後(すでにログインしている場合も同様)、CLI でプロジェクト名とデータベースのリージョンを選択します。

コマンドが完了すると、次のものが作成されます。

  • プラットフォームコンソール上の、Prisma Postgres データベースインスタンスを含むプロジェクト。
  • schema.prisma を含む prisma フォルダー。このファイルでデータベースのスキーマを定義します。
  • プロジェクトルートの .env ファイル。Prisma Postgres のデータベース URL DATABASE_URL=<your-prisma-postgres-database-url> が含まれます。

.dev.vars ファイルを作成し、DATABASE_URL を保存します。

bash
DATABASE_URL="your_prisma_postgres_url"

.env ファイルは残しておいてください。後で Prisma CLI がマイグレーションを実行したり、Prisma Client を生成したり、Prisma Studio を開いたりする際に必要です。

2. プロジェクトで Prisma を設定する ​

schema.prisma ファイルを開いてデータベーススキーマのモデルを定義します。たとえば、User モデルを追加できます。

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

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

model User {
  id  Int @id @default(autoincrement())
  email String
  name 	String
}

Prisma Migrate で変更をデータベースに適用します。

bash
npx prisma migrate dev

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

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 ORM と組み合わせて使い、コネクションプーリングやエッジキャッシュを利用したい場合は、Prisma Accelerate を有効にできます。プロジェクトの設定方法については、Prisma Accelerate を参照してください。

Prisma ドライバーアダプターを使う ​

Prisma は、driverAdapters を介して D1 データベースと組み合わせて使えます。事前に Prisma をインストールし、Wrangler を統合して Hono プロジェクトにバインドする必要があります。Hono、Prisma、Cloudflare D1 のドキュメントは別々に管理され、正確な手順がひとまとまりになっていないため、ここではサンプルプロジェクトを示します。

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 に設定されていることを確認してください。

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 Client の設定 ​

Prisma で D1 データベースをクエリするには、次のコマンドで型を追加する必要があります。

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

Hono と Wrangler の環境値を結び付けます。

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 や Thunder Client で結果を確認できます。

リソース ​

次のリソースを使ってアプリケーションをさらに改善できます。

MIT ライセンスで公開されています。