跳到主要內容

Prisma ORM 與 Next.js 使用綜合指南

Prisma ORM 和 Next.js 是構建現代、伺服器端渲染和 API 驅動的 Web 應用程式的強大組合。本指南整合了各種技巧和策略,幫助您最大限度地發揮它們的潛力。無論您是尋找最佳實踐、單體倉庫設定指南,還是動態使用策略,我們都為您提供了全面的資訊。


開發中使用 Prisma Client 的最佳實踐

避免多個 Prisma Client 例項

在開發 Next.js 應用程式時,一個常見問題是意外建立多個 Prisma Client 例項。這通常發生在 Next.js 開發中的熱過載功能。

為什麼會發生這種情況

Next.js 的熱過載功能頻繁重新載入模組以即時反映程式碼更改。然而,這可能導致建立多個 Prisma Client 例項,從而消耗資源並可能導致意外行為。

為避免這種情況,請透過使用全域性變數來建立單個 Prisma Client 例項

// lib/prisma.ts
import { PrismaClient } from "@prisma/client";

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

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

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

使用這種方法可確保即使在開發過程中進行熱過載,也只存在一個 Prisma Client 例項。


在單體倉庫中設定 Prisma ORM

在單體倉庫中使用 Prisma ORM 的挑戰

單體倉庫允許多個專案共享程式碼和依賴項,使其成為現代開發的流行選擇。然而,在單體倉庫中使用 Prisma ORM 可能帶來與依賴項解析和模式管理相關的挑戰。

主要問題

  1. 依賴項解析:單體倉庫中的多個包如果使用不同版本的 Prisma ORM,可能會導致衝突。
  2. 模式集中化:在多個專案中管理單個 Prisma Schema 可能會很複雜。

單體倉庫整合的最佳實踐

  • 集中化 Prisma Schema:將 schema.prisma 檔案放在共享包中,例如 @myorg/db,以確保一致性。

  • 為生成的客戶端使用自定義輸出目錄:為生成的 Prisma Client 定義自定義輸出目錄,以在包之間保持一致性。

  • 在根目錄安裝依賴項:為防止版本衝突,請在單體倉庫的根目錄安裝 Prisma ORM。如果個別包需要直接訪問 Prisma(例如,用於本地客戶端生成),請也在這些包中安裝它。您可以使用像 Turborepo 這樣的單體倉庫工具,遵循其最佳實踐,或者採用類似的策略來使您的應用程式中的依賴項保持同步。

  • 使用 NPM 指令碼進行生成:

      {
    "scripts": {
    "prisma:generate": "prisma generate --schema=./packages/db/schema.prisma"
    }
    }

此方法使您的 Prisma Schema 和生成的客戶端在單體倉庫中的所有專案之間保持同步。


Prisma Client 在 Next.js 中的動態使用

處理動態場景

動態用例,例如處理租戶特定資料庫,在使用 Prisma ORM 與 Next.js 時需要額外考慮。

問題

每個租戶可能都有自己的資料庫,這需要在執行時建立單獨的 Prisma Client 例項。由於 Next.js 的混合渲染模型,這可能會很複雜。

解決方案

使用工廠函式根據租戶特定配置動態建立 Prisma Client 例項

// lib/prismaDynamic.ts
import { PrismaClient } from "@prisma/client";

type TenantConfig = {
databaseUrl: string;
};

export function createPrismaClient(config: TenantConfig): PrismaClient {
return new PrismaClient({
datasources: {
db: {
url: config.databaseUrl,
},
},
});
}

確保您管理動態建立的 Prisma Client 例項的生命週期,以避免資源耗盡。

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