儲存庫
文件
工具
Prisma

在 Turborepo 中使用 Prisma

Prisma(在新分頁中開啟) 是一款非常受歡迎的 ORM,具備自動遷移、類型安全和整合工具。將其與 Turborepo 搭配使用,可以減少您花費在產生程式碼上的時間,並輕鬆確保產生的 Prisma 程式碼始終是最新的。

指南

本指南將說明如何

  1. 在單一儲存庫中設定 Prisma
  2. 處理遷移和程式碼產生指令碼
  3. 使用 Turborepo 快取這些指令碼
  4. 確保在執行 devbuild 時,這些指令碼始終執行

如果您已在資料庫中設定 Prisma,您可以跳到 步驟 4

1. 建立你的單一儲存庫

如果你沒有現有的專案,請使用我們的 快速入門 建立新的單一儲存庫。

2. 新增新的 database 套件

在 packages 中建立一個名為 database 的新資料夾,資料夾內包含 package.json

{
  "name": "database",
  "version": "0.0.0",
  "dependencies": {
    "@prisma/client": "latest"
  },
  "devDependencies": {
    // Replace "latest" with the latest version
    "prisma": "latest"
  }
}

如果你使用 pnpm,你應該在根目錄新增一個名為 .npmrc 的檔案

public-hoist-pattern[]=*prisma*

執行你的套件管理員的安裝步驟,以安裝新的依賴項。

3. 執行 prisma init

cd 進入 packages/database

cd packages/database

執行 npx prisma init

這應該會在 packages/database 內建立幾個檔案

prisma/schema.prisma
.gitignore
.env
  • schema.prisma 是你的 Prisma schema (在新分頁中開啟) 所在的位置。在這裡,你可以修改資料庫的形狀。
  • .gitignore 將一些忽略的檔案新增到 git
  • .env 讓您可以手動指定 Prisma 的 DATABASE_URL

此時,您應該參閱 Prisma 文件,了解 如何將您的資料庫連線到 Prisma(在新分頁中開啟)

連線資料庫後,您可以繼續進行。

4. 設定腳本

讓我們在 package.json 中新增一些腳本,該檔案位於 packages/database

{
  "scripts": {
    "db:generate": "prisma generate",
    "db:push": "prisma db push --skip-generate"
  }
}

我們也來在根目錄的 turbo.json 中新增這些腳本

{
  "pipeline": {
    "db:generate": {
      "cache": false
    },
    "db:push": {
      "cache": false
    }
  }
}

現在,我們可以從儲存庫的根目錄執行 turbo db:push db:generate,以自動遷移我們的資料庫並產生我們的類型安全 Prisma 程式碼。

我們在 db:push 上使用 --skip-generate 標記,以確保它不會在遷移資料庫後自動執行 prisma generate。由於我們自動並行執行這些任務,因此使用 Turborepo 時,這種方式最終會更快。

5. 匯出您的程式碼

接下來,我們需要匯出 @prisma/client,這樣我們才能在應用程式中使用它。讓我們新增一個 index.ts 檔案到 packages/database

export * from '@prisma/client';

遵循 內部套件模式,我們也需要新增 index.tsmaintypes 內部 packages/database/package.json

{
  "main": "./index.ts",
  "types": "./index.ts"
}

匯入 database

現在讓我們將資料庫套件匯入其中一個應用程式中進行測試。假設你在 apps/web 中有一個應用程式。將相依性新增到 apps/web/package.json

{
  "dependencies": {
    "database": "*"
  }
}

執行套件管理員的安裝指令。

現在,您可以在應用程式的任何位置從 database 匯入 PrismaClient

import { PrismaClient } from 'database'
 
const client = new PrismaClient();

您可能還需要在應用程式內進行一些設定,以允許其執行內部套件。請查看我們的 內部套件文件 以取得更多資訊。

6. 釐清指令碼

現在,我們處於相當不錯的位置。我們有一個可重複使用的 database 模組,我們可以將其匯入任何應用程式中。我們有一個 turbo db:push 指令碼,我們可以使用它將變更推送到資料庫。

但是,我們的 db:generate 指令碼尚未最佳化。它們為我們的 devbuild 任務提供重要的程式碼。如果新開發人員在應用程式上執行 dev,而沒有先執行 db:generate,他們將會收到錯誤訊息。

因此,讓我們確保在使用者執行 dev 之前,總是執行 db:generate

{
  "pipeline": {
    "dev": {
      "dependsOn": ["^db:generate"],
      "cache": false
    },
    "build": {
      "dependsOn": ["^db:generate"],
      "outputs": ["your-outputs-here"]
    },
    "db:generate": {
      "cache": false
    }
  }
}

查看 執行任務 部分,以進一步了解 ^db:generate 語法。

7. 快取 prisma generate 的結果

prisma generate 會將檔案輸出至檔案系統,通常在 node_modules 內部。理論上,應該可以快取 prisma generate 的輸出,搭配 Turborepo 可節省幾秒鐘的時間。

然而,Prisma 在不同的套件管理員中表現不同。這可能會導致無法預測的結果,在某些情況下可能會導致部署中斷。我們建議不要快取 prisma generate 的結果,而不是記錄每種方法的複雜性。<由於 prisma generate 通常只花費 5-6 秒,而且在較大的 schema 檔案中也不會花費更長的時間,這似乎是一個很好的折衷方案。

您可能希望自己嘗試一下。如果您找到一個您認為可行的解決方案,請隨時 新增問題(在新分頁中開啟),我們可以更新此部分。

  1. 進入生產

現在您已經完成到此,您已準備好部署您的應用程式。根據您的資料庫所在位置,您需要根據資料庫設定的文件設計您的部署管線。從這一點開始,需要考慮許多因素,因此我們無法提供一體適用的解決方案。您可能需要查看資料庫和其部署平台的文件以瞭解更多資訊。