在 Turborepo 中使用 Prisma
Prisma(在新分頁中開啟) 是一款非常受歡迎的 ORM,具備自動遷移、類型安全和整合工具。將其與 Turborepo 搭配使用,可以減少您花費在產生程式碼上的時間,並輕鬆確保產生的 Prisma 程式碼始終是最新的。
指南
本指南將說明如何
- 在單一儲存庫中設定 Prisma
- 處理遷移和程式碼產生指令碼
- 使用 Turborepo 快取這些指令碼
- 確保在執行
dev
或build
時,這些指令碼始終執行
如果您已在資料庫中設定 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.ts
到 main
和 types
內部 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
指令碼尚未最佳化。它們為我們的 dev
和 build
任務提供重要的程式碼。如果新開發人員在應用程式上執行 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
檔案中也不會花費更長的時間,這似乎是一個很好的折衷方案。
您可能希望自己嘗試一下。如果您找到一個您認為可行的解決方案,請隨時 新增問題(在新分頁中開啟),我們可以更新此部分。
- 進入生產
現在您已經完成到此,您已準備好部署您的應用程式。根據您的資料庫所在位置,您需要根據資料庫設定的文件設計您的部署管線。從這一點開始,需要考慮許多因素,因此我們無法提供一體適用的解決方案。您可能需要查看資料庫和其部署平台的文件以瞭解更多資訊。