Cloudflare Workers で Prisma を使用する方法
Cloudflare Workers で Prisma を使用する方法は2つあります。Prisma Accelerate を使用する方法と、Driver Adapter を使用する方法です。
Prisma Accelerate の使用
Prisma のインストール
Hono Cloudflare Workers に Prisma をインストールします。ここでは、PostgreSQL データベースとして neon.tech の無料プランを使用していますが、プロジェクトに適したデータベースを使用できます。
neon.tech にアクセスして、PostgreSQL データベースを無料で作成します。
npm i prisma --save-dev
npx prisma init
Prisma Accelerate の設定
Accelerate を設定するには、Prisma Accelerate にアクセスして、ログインまたは無料で登録します。
ログイン後、新しい Accelerate プロジェクトを作成できるページに移動します。
「新規プロジェクト」ボタンをクリックして、プロジェクト名を入力します。
その後、下記のようなページが表示されます。
「Accelerate を有効化」ボタンをクリックすると、次のページが表示されます。
neon.tech データベースの接続文字列を「データベース接続文字列」フィールドに貼り付け、リージョンを選択して、「Accelerate を有効化」ボタンをクリックします。
次のようなものが表示されます。
「APIキーを生成」をクリックすると、下記のような新しいAPIキーを受け取ります。
DATABASE_URL="prisma://accelerate...."
この `DATABASE_URL` をコピーし、` .dev.vars` と ` .env` に保存して、後で prisma cli がアクセスできるようにします。
プロジェクトでの Prisma の設定
受け取った neon.tech のURLは代替として使用することもでき、Prisma により多くのオプションを提供するため、後で使用するように保存してください。
DATABASE_URL="your_prisma_accelerate_url"
DIRECT_URL="your_neon_tech_url
次に、`schema.prisma` ファイルに移動し、次のようにURLを設定します。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
プロジェクトで後で使えるような、このような関数を作成します。
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 Driver Adapter の使用
Prisma は、`driverAdapters` を介して D1 データベースで使用できます。前提条件は、Prisma をインストールし、Wrangler を統合して Hono プロジェクトにバインドすることです。これは、Hono、Prisma、および D1 Cloudflare のすべてのドキュメントが分離されており、正確で精密な手順ごとの指示がないため、サンプルプロジェクトです。
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` で DB がバインドされていることを確認してください。
[[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 generate
Prisma クライアントの設定
D1 データベースを使用して Prisma からデータベースをクエリするには、次のように型を追加する必要があります。
npx wrangler types
`worker-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 prismaClients
Wrangler 環境変数と Hono のバインディング
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 ルートでの使用例
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 を使用して結果を確認するルート `/` にすべてのユーザーが返されます。