跳到主要內容

如何在 pnpm workspaces monorepo 中使用 Prisma ORM

10 分鐘

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

pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
catalogs:
prisma:
prisma: latest
注意

catalogs 幫助您在儲存庫中固定 Prisma 的特定版本。您可以在此處瞭解更多資訊。在 pnpm-workspace.yaml 檔案中明確地固定最新版本的 prisma。在撰寫本文時,版本為 6.3.1

最後,為您的應用程式和共享包建立目錄

mkdir apps
mkdir -p packages/database

2. 設定共享資料庫包

本節介紹如何建立使用 Prisma 的獨立資料庫包。該包將包含所有資料庫模型和生成的 Prisma Client,使其可在您的 monorepo 中重複使用。

2.1. 初始化包並安裝依賴項

導航到 packages/database 目錄並初始化一個新包

cd packages/database
pnpm init

使用固定的 catalog 將 Prisma 作為開發依賴項新增到您的 package.json

database/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。這確保了生成的型別能夠正確解析

prisma/schema.prisma
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 命令

database/package.json
{
"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

database/client.ts
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 例項和所有生成的型別

database/index.ts
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 包新增為依賴項

web/package.json
"dependencies": {
"database": "workspace:*",
// additional dependencies
// ...
}

執行以下命令安裝 database

pnpm install

3.2. 在您的應用程式程式碼中整合共享的 database

修改您的 Next.js 應用程式程式碼以使用資料庫包中的 Prisma Client。按如下方式更新 app/page.tsx

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 之旅。隨時瞭解情況、參與其中並與其他開發者協作。

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

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