跳到主要內容

如何在 Cloudflare D1 中使用 Prisma ORM

10 分鐘

簡介

本指南將向您展示如何在 Cloudflare D1(一個在 Cloudflare 邊緣網路上執行的無伺服器 SQL 資料庫)中使用 Prisma ORM。您將學習如何使用 D1 設定 Prisma ORM、處理遷移以及將應用程式部署到 Cloudflare Workers。您可以在 GitHub 上找到一個部署就緒的示例

先決條件

在開始本指南之前,請確保您已具備:

  • 一個 Cloudflare 賬戶
  • 已安裝 Node.js(版本 18 或更高)
  • 已安裝 Wrangler CLI(版本 3.39.0 或更高)
  • 對 Cloudflare Workers 和 D1 有基本瞭解

1. 配置 Prisma schema

在您的 Prisma schema 中,將 driverAdapters 預覽功能新增到 generator 塊中,並將 datasourceprovider 設定為 sqlite。如果您剛剛使用 prisma init 啟動了 Prisma schema,請務必新增以下 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@^3.39.0 以上版本的 Wrangler CLI,否則下一節中使用的 --remote 標誌將不可用。

3. 設定 D1 資料庫連線

要將您的 Workers 連線到 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 listnpx wrangler d1 info __YOUR_D1_DATABASE_NAME__

4. 設定資料庫遷移

注意

我們建議使用 prisma migrate 來保持 D1 中的資料遷移。但是,如果您更喜歡使用 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'),
migrate: {
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 來遷移您的資料庫以匹配您的本地 schema

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 從繫結中生成 Env 型別,並將其儲存在一個名為 worker-configuration.d.ts 的單獨檔案中。)
  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

現在您可以在瀏覽器中開啟 https://: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)' }]

後續步驟

現在您已經使用 Cloudflare D1 設定了 Prisma ORM,您可以:

  • 使用 Prisma 強大的查詢 API 新增更復雜的查詢
  • 設定 Prisma Studio 進行資料庫管理
  • 實施資料庫監控
  • 新增自動化測試

更多資訊


與 Prisma 保持聯絡

透過以下方式與我們聯絡,繼續您的 Prisma 之旅: 我們的活躍社群。保持瞭解、參與並與其他開發者協作。

我們真誠地重視您的參與,並期待您成為我們社群的一員!

© . This site is unofficial and not affiliated with Prisma Data, Inc.