Cloudflare Workers で Prisma を使う
Prisma ORM は、データベース操作のためのモダンで堅牢なツールキットです。Hono と Cloudflare Workers と組み合わせることで、高性能なサーバーレスアプリケーションをエッジにデプロイできます。
このガイドでは、Hono で Prisma ORM を使う 2 つの方法を紹介します。
Prisma Postgres: Prisma と統合されたマネージドのサーバーレス PostgreSQL データベースです。コネクションプーリングを内蔵し、コールドスタートがないため、サーバーレスおよびエッジ環境のスケーリングの問題を軽減でき、本番向けの構成に適しています。
ドライバーアダプター: Prisma の柔軟なドライバーアダプターを使う別の方法です。Prisma ORM がサポートする任意のデータベースに接続できます。
それぞれに利点があるため、プロジェクトの要件に合う方法を選べます。
Prisma Postgres を使う
Prisma Postgres は、ユニカーネル上に構築されたマネージドのサーバーレス PostgreSQL データベースです。コネクションプーリング、キャッシュ、クエリ最適化の提案などをサポートします。初期開発、テスト、個人プロジェクト向けに十分な無料枠が用意されています。
1. Prisma と必要な依存関係をインストールする
Hono プロジェクトに Prisma をインストールします。
npm i prisma --save-devPrisma Postgres に必要な Prisma クライアント拡張をインストールします。
npm i @prisma/extension-acceleratePrisma Postgres のインスタンスを使って Prisma を初期化します。
npx prisma@latest init --dbPrisma Data Platform のアカウントがまだない場合やログインしていない場合、コマンドは利用可能な認証プロバイダーでのログインを求めます。ブラウザーが開くので、ログインするかアカウントを作成してください。完了したら CLI に戻ります。
ログイン後(すでにログインしている場合も同様)、CLI でプロジェクト名とデータベースのリージョンを選択します。
コマンドが完了すると、次のものが作成されます。
- プラットフォームコンソール上の、Prisma Postgres データベースインスタンスを含むプロジェクト。
schema.prismaを含むprismaフォルダー。このファイルでデータベースのスキーマを定義します。- プロジェクトルートの
.envファイル。Prisma Postgres のデータベース URLDATABASE_URL=<your-prisma-postgres-database-url>が含まれます。
.dev.vars ファイルを作成し、DATABASE_URL を保存します。
DATABASE_URL="your_prisma_postgres_url".env ファイルは残しておいてください。後で Prisma CLI がマイグレーションを実行したり、Prisma Client を生成したり、Prisma Studio を開いたりする際に必要です。
2. プロジェクトで Prisma を設定する
schema.prisma ファイルを開いてデータベーススキーマのモデルを定義します。たとえば、User モデルを追加できます。
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 で変更をデータベースに適用します。
npx prisma migrate dev後でプロジェクト内で使えるように、次のような関数を作成します。
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
}この関数をプロジェクト内で使う例を示します。
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 のバインディングを使い、アダプター経由で接続します。
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1その後、Prisma がデータベースのスキーマを生成します。prisma/schema.prisma に簡単なモデルを定義し、アダプターの変更も忘れないでください。
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 データベースがすでに準備できている場合は、この手順をスキップできます。まだない場合は、こちらを参考に作成してください。
npx wrangler d1 create __DATABASE_NAME__ // change it with yoursデータベースのバインディングが wrangler.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 データベースを更新します。
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 にマイグレーションします。
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generatePrisma Client の設定
Prisma で D1 データベースをクエリするには、次のコマンドで型を追加する必要があります。
npx wrangler typesworker-configuration.d.ts ファイルが生成されます。
Prisma クライアント
Prisma を全体で使うには、lib/prismaClient.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 prismaClientsHono と Wrangler の環境値を結び付けます。
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'
type Bindings = {
MY_KV: KVNamespace
DB: D1Database
}
const app = new Hono<{ Bindings: Bindings }>() // binding env valueHono のルートで使う例:
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 で結果を確認できます。
リソース
次のリソースを使ってアプリケーションをさらに改善できます。
- クエリにキャッシュを追加する。
- Prisma Postgres のドキュメントを読む。