跳到主內容

如何在 Turborepo 中使用 Prisma ORM

15 分鐘

Prisma 是一款強大的資料庫 ORM,而 Turborepo 簡化了 monorepo 工作流程。透過結合這些工具,您可以為專案建立可擴充套件、模組化的架構。

本指南將向您展示如何在 Turborepo monorepo 中將 Prisma 設定為獨立包,從而在多個應用程式之間實現高效配置、型別共享和資料庫管理。

您將學到什麼:

  • 如何在 Turborepo monorepo 中設定 Prisma。
  • 在包之間生成和重用 PrismaClient 的步驟。
  • 將 Prisma 包整合到 monorepo 中的其他應用程式中。

先決條件

1. 設定您的專案

要設定名為 turborepo-prisma 的 Turborepo monorepo,請執行以下命令

npx create-turbo@latest turborepo-prisma

系統會提示您選擇包管理器,本指南將使用 npm

資訊
  • 您想使用哪個包管理器? npm

設定完成後,為專案選擇一個包管理器。導航到專案根目錄並安裝 Turborepo 作為開發依賴項

cd turborepo-prisma
npm install turbo --save-dev

有關安裝 Turborepo 的更多資訊,請參閱 官方 Turborepo 指南

2. 向 monorepo 新增一個新的 database

2.1 建立包並安裝 Prisma

packages 目錄中建立一個 database 包。然後,透過執行以下命令為該包建立 package.json 檔案

cd packages/
mkdir database
cd database
touch package.json

package.json 檔案定義如下

packages/database/package.json
{
"name": "@repo/db",
"version": "0.0.0"
}

接下來,安裝使用 Prisma ORM 所需的依賴項。使用您首選的包管理器

npm install prisma --save-dev
npm install @prisma/client
注意

如果使用 Prisma Postgres,請安裝 @prisma/extension-accelerate

npm install @prisma/extension-accelerate

2.2. 初始化 Prisma 並定義模型

database 目錄內,執行以下命令初始化 Prisma

npx prisma init --db --output ../generated/prisma

這將在 packages/database 內部建立幾個檔案

  • 一個包含 schema.prisma 檔案的 prisma 目錄。
  • 一個 Prisma Postgres 資料庫。
  • 專案根目錄中包含 DATABASE_URL.env 檔案。
  • 一個用於生成 Prisma Client 的 output 目錄,路徑為 generated/prisma

packages/database/prisma/schema.prisma 檔案中,新增以下模型

packages/database/prisma/schema.prisma
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}

model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
}
警告

建議將 ../generated/prisma 新增到 .gitignore 檔案中,因為它包含平臺特定的二進位制檔案,可能導致不同環境之間的相容性問題。

在自定義目錄中生成 Prisma 型別的重要性

schema.prisma 檔案中,我們指定了一個自定義的 output 路徑,Prisma 將在此處生成其型別。這確保了 Prisma 的型別在不同的包管理器中都能正確解析。

資訊

在本指南中,型別將在 database/generated/prisma 目錄中生成。

2.3. 新增指令碼並執行遷移

讓我們在 packages/database 內部的 package.json 中新增一些指令碼

packages/database/package.json
{
"name": "@repo/db",
"version": "0.0.0",
"scripts": {
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev --skip-generate",
"db:deploy": "prisma migrate deploy"
},
"devDependencies": {
"prisma": "^6.6.0"
},
"dependencies": {
"@prisma/client": "^6.6.0"
}
}

我們還將這些指令碼新增到根目錄的 turbo.json 中,並確保 DATABASE_URL 已新增到環境中

turbo.json
{
"$schema": "https://turbo.build/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"cache": false,
"persistent": true
},
"db:generate": {
"cache": false
},
"db:migrate": {
"cache": false,
"persistent": true // This is necessary to interact with the CLI and assign names to your database migrations.
},
"db:deploy": {
"cache": false
}
}

遷移您的 prisma.schema 並生成型別

導航到專案根目錄並執行以下命令以自動遷移我們的資料庫

npx turbo db:migrate

生成您的 prisma.schema

要從 Prisma schema 生成型別,請在專案根目錄執行

npx turbo db:generate

2.4. 匯出 Prisma 客戶端和型別

接下來,匯出生成的型別和 PrismaClient 例項,以便在您的應用程式中使用。

packages/database 目錄中,建立一個 src 資料夾並新增一個 client.ts 檔案。此檔案將定義 PrismaClient 的例項

packages/database/src/client.ts
import { PrismaClient } from "../generated/prisma";
import { withAccelerate } from "@prisma/extension-accelerate";

const globalForPrisma = global as unknown as { prisma: PrismaClient };

export const prisma =
globalForPrisma.prisma || new PrismaClient().$extends(withAccelerate());

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

然後在 src 資料夾中建立一個 index.ts 檔案,重新匯出生成的 Prisma 型別和 PrismaClient 例項

packages/database/src/index.ts
export { prisma } from './client' // exports instance of prisma 
export * from "../generated/prisma" // exports generated types from prisma

遵循 即時打包模式,並在 packages/database/package.json 中建立包的入口點

警告

如果您不使用打包器,請改用 編譯包 策略。

packages/database/package.json
{
"name": "@repo/db",
"version": "0.0.0",
"scripts": {
"db:generate": "npx prisma generate",
"db:migrate": "npx prisma migrate dev --skip-generate",
"db:deploy": "npx prisma migrate deploy"
},
"devDependencies": {
"prisma": "^6.6.0"
},
"dependencies": {
"@prisma/client": "^6.6.0"
},
"exports": {
".": "./src/index.ts"
}
}

完成這些步驟後,您就可以在整個 monorepo 中訪問 Prisma 型別和 PrismaClient 例項。

3. 在 Web 應用中匯入 database

turborepo-prisma 專案應在 apps/web 處有一個名為 web 的應用程式。將 database 依賴項新增到 apps/web/package.json

{
// ...
"dependencies": {
"@repo/db": "*"
// ...
}
// ...
}

apps/web 目錄內執行您的包管理器的安裝命令

cd apps/web
npm install

讓我們從 web 應用程式中的 database 包匯入例項化後的 prisma 客戶端。

apps/web/app 目錄中,開啟 page.tsx 檔案並新增以下程式碼

apps/web/app/page.tsx
import styles from "./page.module.css";
import { prisma } from "@repo/db";

export default async function Home() {
const user = await prisma.user.findFirst()
return (
<div className={styles.page}>
{user?.name ?? "No user added yet"}
</div>
);
}

然後,在 web 目錄中建立一個 .env 檔案,並將 /database 目錄中包含 DATABASE_URL.env 檔案內容複製到其中。

apps/web/.env
DATABASE_URL="Same database url as used in the database directory"
注意

如果您想在 Turborepo 設定中,在所有應用程式和包中使用根目錄中的單個 .env 檔案,請考慮使用 dotenvx 等包。

要實現這一點,請更新每個包或應用程式的 package.json 檔案,以確保它們從共享的 .env 檔案載入所需的環境變數。有關詳細說明,請參閱 Turborepo 的 dotenvx 指南

請記住,Turborepo 建議為每個包使用單獨的 .env 檔案,以促進模組化並避免潛在衝突。

4. 配置 Turborepo 中的任務依賴項

db:generatedb:deploy 指令碼尚未針對 monorepo 設定進行最佳化,但對於 devbuild 任務至關重要。

如果新開發人員在未首先執行 db:generate 的情況下執行應用程式上的 turbo dev,他們將遇到錯誤。

為防止這種情況發生,請確保在執行 devbuild 之前始終執行 db:generate。此外,請確保在 db:build 之前執行 db:deploydb:generate。以下是如何在 turbo.json 檔案中配置它們:

turbo.json
{
"$schema": "https://turbo.build/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build", "^db:generate"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"dependsOn": ["^db:generate"],
"cache": false,
"persistent": true
},
"db:generate": {
"cache": false
},
"db:migrate": {
"cache": false,
"persistent": true
},
"db:deploy": {
"cache": false
}
}
}

5. 在開發環境中執行專案

警告

在啟動開發伺服器之前,請注意,如果您使用的是 Next.js v15.2.0,請不要使用 Turbopack,因為存在已知的 問題。透過更新 apps/web/package.json 從開發指令碼中移除 Turbopack

apps/web/package.json
"script":{
"dev": "next dev --port 3000",
}

然後從專案根目錄執行專案

npx turbo run dev --filter=web

導航到 https://:3000,您應該會看到訊息

No user added yet
注意

您可以透過建立種子指令碼或手動使用 Prisma Studio 將使用者新增到資料庫。

要使用 Prisma Studio 透過 GUI 手動新增資料,請導航到 packages/database 目錄並使用您的包管理器執行 prisma studio

npx prisma studio

此命令會在 https://:5555 啟動一個帶 GUI 的伺服器,允許您檢視和修改資料。

恭喜,您已完成 Turborepo 的 Prisma 設定!

後續步驟

  • 擴充套件您的 Prisma 模型以處理更復雜的資料關係。
  • 實現額外的 CRUD 操作以增強應用程式的功能。
  • 檢視 Prisma Postgres,瞭解如何擴充套件您的應用程式。

更多資訊


與 Prisma 保持聯絡

透過以下方式繼續您的 Prisma 之旅 我們的活躍社群。保持資訊靈通,積極參與,並與其他開發者協作

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

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