如何在 pnpm workspaces monorepo 中使用 Prisma ORM
Prisma 是一個強大的 ORM,用於管理您的資料庫,結合 pnpm Workspaces 後,您可以維護一個精簡且模組化的 monorepo 架構。在本指南中,我們將逐步在 pnpm Workspaces monorepo 中,將 Prisma 設定為自己的包,從而實現在應用程式之間可維護的型別共享和高效的資料庫管理。
您將學到什麼:
- 如何使用 pnpm Workspaces 初始化 monorepo。
- 將 Prisma 整合到獨立包中的步驟。
- 如何在包之間生成和共享 Prisma Client。
- 將 Prisma 包整合到工作區內的應用程式中。
1. 準備您的專案並配置 pnpm workspaces
在整合 Prisma 之前,您需要設定專案結構。首先為專案建立一個新目錄(例如,my-monorepo)並初始化一個 Node.js 專案
mkdir my-monorepo
cd my-monorepo
pnpm init
接下來,建立一個 pnpm-workspace.yaml 檔案來定義工作區結構並固定 Prisma 版本
touch pnpm-workspace.yaml
將以下配置新增到 pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
catalogs:
prisma:
prisma: latest
最後,為您的應用程式和共享包建立目錄
mkdir apps
mkdir -p packages/database
2. 設定共享資料庫包
本節介紹如何建立使用 Prisma 的獨立資料庫包。該包將包含所有資料庫模型和生成的 Prisma Client,使其可在您的 monorepo 中重複使用。
2.1. 初始化包並安裝依賴項
導航到 packages/database 目錄並初始化一個新包
cd packages/database
pnpm init
使用固定的 catalog 將 Prisma 作為開發依賴項新增到您的 package.json 中
"devDependencies": {
"prisma": "catalog:prisma"
}
然後安裝 Prisma
pnpm install
然後,新增額外的依賴項
pnpm add typescript tsx @types/node -D
然後安裝使用 Prisma Postgres 所需的 Prisma Client 擴充套件
pnpm add @prisma/extension-accelerate
本指南使用 Prisma Postgres。如果您計劃使用不同的資料庫,可以省略 @prisma/extension-accelerate 包。
為您的 database 包初始化一個 tsconfig.json 檔案
pnpm tsc --init
2.2. 在您的資料庫包中設定 Prisma ORM
透過執行以下命令,在 database 包中初始化 Prisma ORM 並附帶一個 Prisma Postgres 例項
pnpm prisma init --db
輸入您的專案名稱並選擇一個數據庫區域。
本指南將使用 Prisma Postgres。如果您不使用 Prisma Postgres 資料庫,則無需新增 --db 標誌。
此命令
- 將您的 CLI 連線到您的帳戶。如果您未登入或沒有帳戶,瀏覽器將開啟以引導您建立新帳戶或登入現有帳戶。
- 建立一個包含
schema.prisma檔案的prisma目錄,用於您的資料庫模型。 - 建立一個
.env檔案,其中包含您的DATABASE_URL(例如,對於 Prisma Postgres,它應該類似於DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...")。
編輯 schema.prisma 檔案以在資料庫中定義一個 User 模型,並指定一個自定義 output 目錄來生成 Prisma Client。這確保了生成的型別能夠正確解析
generator client {
provider = "prisma-client-js"
output = "../generated/client"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
接下來,將輔助指令碼新增到您的 package.json 中,以簡化 Prisma 命令
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"db:generate": "prisma generate --no-engine",
"db:migrate": "prisma migrate dev",
"db:deploy": "prisma migrate deploy",
"db:studio": "prisma studio"
}
}
如果您不使用 Prisma Postgres 作為資料庫,請從 db:generate 指令碼中排除 --no-engine 標誌。
使用 Prisma Migrate 遷移您的資料庫更改
pnpm run db:migrate
當 CLI 提示時,為您的遷移輸入一個描述性名稱。
遷移成功後,建立一個 client.ts 檔案來初始化帶有 Accelerate 擴充套件的 Prisma Client
import { PrismaClient } from "./generated/client";
import { withAccelerate } from "@prisma/extension-accelerate";
// Instantiate the extended Prisma client to infer its type
const extendedPrisma = new PrismaClient().$extends(withAccelerate());
type ExtendedPrismaClient = typeof extendedPrisma;
// Use globalThis for broader environment compatibility
const globalForPrisma = globalThis as typeof globalThis & {
prisma?: ExtendedPrismaClient;
};
// Named export with global memoization
export const prisma: ExtendedPrismaClient =
globalForPrisma.prisma ?? extendedPrisma;
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}
如果您不使用 Prisma Postgres 作為資料庫,請排除 import { withAccelerate } 行及其後的一行中的 .$extends(withAccelerate())。
然後,建立一個 index.ts 檔案來重新匯出 Prisma Client 例項和所有生成的型別
export { prisma } from "./client";
export * from "./generated/client";
至此,您的共享資料庫包已完全配置並可在您的 monorepo 中使用。
3. 設定並整合您的前端應用程式
資料庫包設定完成後,建立一個前端應用程式(使用 Next.js),該應用程式使用共享的 Prisma Client 與您的資料庫互動。
3.1. 引導 Next.js 應用程式
導航到 apps 目錄
cd ../../apps
建立一個名為 web 的新 Next.js 應用程式
pnpm create next-app@latest web --yes
--yes 標誌使用預設配置來引導 Next.js 應用程式(在本指南中,它使用不帶 src/ 目錄的應用程式路由器,並使用 pnpm 作為安裝程式)。
此外,該標誌可能會自動在 web 資料夾中初始化一個 Git 倉庫。如果發生這種情況,請透過執行 rm -r .git 刪除 .git 目錄。
然後,導航到 web 目錄
cd web/
從資料庫包複製 .env 檔案,以確保可使用相同的環境變數
cp ../../packages/database/.env .
開啟 Next.js 應用程式的 package.json 檔案,並將共享的 database 包新增為依賴項
"dependencies": {
"database": "workspace:*",
// additional dependencies
// ...
}
執行以下命令安裝 database 包
pnpm install
3.2. 在您的應用程式程式碼中整合共享的 database 包
修改您的 Next.js 應用程式程式碼以使用資料庫包中的 Prisma Client。按如下方式更新 app/page.tsx
import { prisma } from "database";
export default async function Home() {
const user = await prisma.user.findFirst({
select: {
name: true
}
})
return (
<div>
{user?.name && <p>Hello from {user.name}</p>}
{!user?.name && <p>No user has been added to the database yet. </p>}
</div>
);
}
此程式碼演示了匯入和使用共享的 Prisma Client 來查詢您的 User 模型。
3.3. 新增輔助指令碼並執行您的應用程式
將以下指令碼新增到 monorepo 的根 package.json 中。它們確保資料庫遷移、型別生成和應用程式構建按正確順序執行
"scripts": {
"build": "pnpm --filter database db:deploy && pnpm --filter database db:generate && pnpm --filter web build",
"start": "pnpm --filter web start",
"dev": "pnpm --filter database db:generate && pnpm --filter web dev",
"studio": "pnpm --filter database db:studio"
}
3.4. 執行您的應用程式
然後回到 monorepo 的根目錄
cd ../../
透過執行以下命令啟動您的開發伺服器
pnpm run dev
在瀏覽器中開啟 https://:3000 以檢視您的應用程式執行情況。
3.5. (可選)使用 Prisma Studio 將資料新增到您的資料庫
您的資料庫中應該還沒有資料。您可以在 CLI 中執行 pnpm run studio 來在 https://:5555 啟動 Prisma Studio,與您的資料庫互動並向其中新增資料。
下一步
您現在已經建立了一個有效使用 Prisma ORM 的 monorepo,其中包含一個整合到 Next.js 應用程式中的共享資料庫包。
要進一步探索和增強您的設定,請考慮閱讀如何將 Prisma ORM 與 Turborepo 結合使用指南。
保持與 Prisma 的聯絡
透過連線到我們的 活躍社群,繼續您的 Prisma 之旅。隨時瞭解情況、參與其中並與其他開發者協作。
- 在 X 上關注我們 獲取公告、直播活動和有用提示。
- 加入我們的 Discord 提問、與社群交流,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 獲取教程、演示和直播。
- 在 GitHub 上參與 透過星標倉庫、報告問題或為問題貢獻。