如何在單個應用程式中使用多個數據庫
簡介
本指南將向你展示如何在單個 Next.js 應用程式 中使用 Prisma ORM 連線多個數據庫。你將學習如何連線兩個不同的 Prisma Postgres 資料庫、管理遷移並將應用程式部署到 Vercel。此方法適用於多租戶應用程式,或在管理多個數據庫連線時需要分離關注點的情況。
先決條件
在開始之前,請確保你已具備以下條件:
- 已安裝 Node.js 18+。
- 一個 Prisma 資料平臺賬戶。
- 一個 Vercel 賬戶(如果你計劃部署你的應用程式)。
1. 設定 Next.js 專案
在你想要的目錄下使用 create-next-app 建立一個新的 Next.js 應用程式
npx create-next-app@latest my-multi-client-app
系統將提示你回答有關專案的一些問題。選擇所有預設選項。
為完整起見,這些選項是:
- TypeScript
- ESLint
- Tailwind CSS
- 無
src目錄 - App Router
- Turbopack
- 預設自定義匯入別名:
@/*
然後,導航到專案目錄
cd my-multi-client-app
2. 設定資料庫和 Prisma Client
在本節中,你將建立兩個獨立的 Prisma Postgres 例項——一個用於使用者資料,一個用於帖子資料。你還將為每個例項配置 Prisma schema 和環境變數。
首先,安裝 Prisma 作為開發依賴項
npm install -D prisma
安裝使用 Prisma Postgres 所需的 Prisma Client 擴充套件
npm install @prisma/extension-accelerate
如果你不使用 Prisma Postgres 資料庫,則不需要 @prisma/extension-accelerate 包。
你已安裝專案所需的依賴項。
2.1. 建立包含使用者資料的 Prisma Postgres 例項
透過執行以下命令使用 Prisma Postgres 例項初始化 Prisma
npx prisma@latest init --db
如果你不使用 Prisma Postgres 資料庫,請勿使用 --db 標誌。相反,請建立兩個 PostgreSQL 資料庫例項,並將其連線 URL 新增到 .env 檔案中,分別命名為 PPG_USER_DATABASE_URL 和 PPG_POST_DATABASE_URL。
按照提示為你的專案命名並選擇資料庫區域。
prisma@latest init --db 命令會:
- 將你的 CLI 連線到你的賬戶。如果你未登入或沒有賬戶,瀏覽器將開啟,引導你建立新賬戶或登入現有賬戶。
- 建立一個包含資料庫模型
schema.prisma檔案的prisma目錄。 - 建立一個包含你的
DATABASE_URL的.env檔案(例如,對於 Prisma Postgres,它應該類似於DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...")。
將 prisma 資料夾重新命名為 prisma-user-database
mv prisma prisma-user-database
編輯你的 .env 檔案,將 DATABASE_URL 重新命名為 PPG_USER_DATABASE_URL
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...
PPG_USER_DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...
開啟 prisma-user-database/schema.prisma 檔案並更新它以定義 User 模型。此外,設定環境變數併為生成的 Prisma Client 指定一個 自定義 output 目錄
generator client {
provider = "prisma-client-js"
output = "../prisma-user-database/user-database-client-types"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
url = env("PPG_USER_DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
你的使用者資料庫模式現已準備就緒。
2.2. 建立用於帖子資料的 Prisma Postgres 例項
重複帖子的資料庫初始化
npx prisma init --db
按照提示操作後,將新的 prisma 資料夾重新命名為 prisma-post-database
mv prisma prisma-post-database
將 .env 中的 DATABASE_URL 變數重新命名為 PPG_POST_DATABASE_URL
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...
PPG_POST_DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI...
編輯 prisma-post-database/schema.prisma 檔案以定義 Post 模型。此外,更新資料來源 URL 並設定一個 自定義 output 目錄
generator client {
provider = "prisma-client-js"
output = "../prisma-post-database/post-database-client-types"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
url = env("PPG_POST_DATABASE_URL")
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
}
你的帖子資料庫模式現已設定完畢。
2.3. 新增輔助指令碼並遷移模式
為簡化你的工作流程,請在 package.json 檔案中新增輔助指令碼,用於執行兩個資料庫的 Prisma 命令
"script":{
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall": "npx prisma generate --schema ./prisma-user-database/schema.prisma --no-engine && npx prisma generate --schema ./prisma-post-database/schema.prisma --no-engine",
"generate": "npx prisma generate --schema ./prisma-user-database/schema.prisma --no-engine && npx prisma generate --schema ./prisma-post-database/schema.prisma --no-engine",
"migrate": "npx prisma migrate dev --schema ./prisma-user-database/schema.prisma && npx prisma migrate dev --schema ./prisma-post-database/schema.prisma",
"deploy": "npx prisma migrate deploy --schema ./prisma-user-database/schema.prisma && npx prisma migrate deploy --schema ./prisma-post-database/schema.prisma",
"studio": "npx prisma studio --schema ./prisma-user-database/schema.prisma --port 5555 & npx prisma studio --schema ./prisma-post-database/schema.prisma --port 5556"
}
如果你不使用 Prisma Postgres 資料庫,請從上述自定義指令碼中移除 --no-engine 標誌。
以下是自定義指令碼的說明:
postinstall:在安裝依賴項後立即執行,使用各自的模式檔案為使用者資料庫和帖子資料庫生成 Prisma Clients。generate:手動觸發兩個模式的 Prisma Clients 生成,確保你的客戶端程式碼反映最新的模型。migrate:使用 Prisma Migrate 在開發模式下為兩個資料庫應用待處理的遷移,根據 Prisma 檔案中的更改更新它們的模式。deploy:在生產環境中執行遷移,將你的即時資料庫與你的 Prisma 模式同步。studio:同時為兩個資料庫在不同埠(使用者資料庫為5555,帖子資料庫為5556)開啟 Prisma Studio,以便進行視覺化資料管理。
執行遷移
npm run migrate
當系統提示時,為每個資料庫相應地命名遷移。
3. 準備應用程式以使用多個 Prisma Client
接下來,建立一個 lib 資料夾,用於儲存例項化和匯出你的 Prisma Client 的輔助檔案
mkdir -p lib && touch lib/user-prisma-client.ts lib/post-prisma-client.ts
3.1. 例項化並匯出使用者資料庫的 Prisma Client
在 lib/user-prisma-client.ts 中,新增以下程式碼
import { PrismaClient } from "../prisma-user-database/user-database-client-types";
import { withAccelerate } from "@prisma/extension-accelerate"
const getPrisma = () => new PrismaClient().$extends(withAccelerate());
const globalForUserDBPrismaClient = global as unknown as {
userDBPrismaClient: ReturnType<typeof getPrisma>;
};
export const userDBPrismaClient =
globalForUserDBPrismaClient.userDBPrismaClient || getPrisma();
if (process.env.NODE_ENV !== "production")
globalForUserDBPrismaClient.userDBPrismaClient = userDBPrismaClient;
如果你不使用 Prisma Postgres 資料庫,請勿使用 withAccelerate 客戶端擴充套件來擴充套件 PrismaClient。
3.2. 例項化並匯出帖子資料庫的 Prisma Client
在 lib/post-prisma-client.ts 中,新增以下程式碼
import { PrismaClient } from "../prisma-post-database/post-database-client-types";
import { withAccelerate } from "@prisma/extension-accelerate"
const getPrisma = () => new PrismaClient().$extends(withAccelerate());
const globalForPostDBPrismaClient = global as unknown as {
postDBPrismaClient: ReturnType<typeof getPrisma>;
};
export const postDBPrismaClient =
globalForPostDBPrismaClient.postDBPrismaClient || getPrisma();
if (process.env.NODE_ENV !== "production")
globalForPostDBPrismaClient.postDBPrismaClient = postDBPrismaClient;
如果你不使用 Prisma Postgres 資料庫,請勿使用 withAccelerate 客戶端擴充套件來擴充套件 PrismaClient。
4. 在 Next.js 應用中整合多個 Prisma Client
修改你的應用程式程式碼以從兩個資料庫中獲取資料。如下更新 app/page.tsx 檔案
import { postDBPrismaClient } from "@/lib/post-prisma-client";
import { userDBPrismaClient } from "@/lib/user-prisma-client";
export default async function Home() {
const user = await userDBPrismaClient.user.findFirst();
const post = await postDBPrismaClient.post.findFirst();
return (
<main className="min-h-screen bg-gray-50 py-12">
<div className="max-w-4xl mx-auto px-4">
<header className="mb-12 text-center">
<h1 className="text-5xl font-extrabold text-gray-900">Multi-DB Showcase</h1>
<p className="mt-4 text-xl text-gray-600">
Data fetched from two distinct databases.
</p>
</header>
<section className="mb-8 bg-white shadow-md rounded-lg p-6">
<h2 className="text-2xl font-semibold text-gray-800 border-b pb-2 mb-4">
User Data
</h2>
<pre className="whitespace-pre-wrap text-sm text-gray-700">
{user ? JSON.stringify(user, null, 2) : "No user data available."}
</pre>
</section>
<section className="bg-white shadow-md rounded-lg p-6">
<h2 className="text-2xl font-semibold text-gray-800 border-b pb-2 mb-4">
Post Data
</h2>
<pre className="whitespace-pre-wrap text-sm text-gray-700">
{post ? JSON.stringify(post, null, 2) : "No post data available."}
</pre>
</section>
</div>
</main>
);
}
4.1. 使用資料填充你的資料庫
在一個單獨的終端視窗中,開啟兩個 Prisma Studio 例項,透過執行指令碼向資料庫新增資料
npm run studio
這將開啟兩個瀏覽器視窗,一個在 https://:5555,另一個在 https://:5556。導航到這些視窗並向兩個資料庫新增示例資料。
4.2. 執行開發伺服器
在啟動開發伺服器之前,請注意,如果你使用的是 Next.js v15.2.0,請勿使用 Turbopack,因為存在一個已知的 問題。透過更新 package.json,從你的開發指令碼中移除 Turbopack
"script":{
"dev": "next dev --turbopack",
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall": "npx prisma generate --schema ./prisma-user-database/schema.prisma --no-engine && npx prisma generate --schema ./prisma-post-database/schema.prisma --no-engine",
"generate": "npx prisma generate --schema ./prisma-user-database/schema.prisma --no-engine && npx prisma generate --schema ./prisma-post-database/schema.prisma --no-engine",
"migrate": "npx prisma migrate dev --schema ./prisma-user-database/schema.prisma && npx prisma migrate dev --schema ./prisma-post-database/schema.prisma",
"deploy": "npx prisma migrate deploy --schema ./prisma-user-database/schema.prisma && npx prisma migrate deploy --schema ./prisma-post-database/schema.prisma",
"studio": "npx prisma studio --schema ./prisma-user-database/schema.prisma --port 5555 & npx prisma studio --schema ./prisma-post-database/schema.prisma --port 5556"
}
在一個單獨的終端視窗中,透過執行以下命令啟動開發伺服器
npm run dev
導航到 https://:3000,檢視你的 Next.js 應用程式顯示來自兩個資料庫的資料

恭喜你,你的 Next.js 應用程式已成功執行,並使用兩個 Prisma Client 例項查詢不同的資料庫。
5. 使用多個數據庫將 Next.js 應用程式部署到 Vercel
按照以下步驟部署你的應用程式
- 確保你的專案已進行版本控制並推送到 GitHub 倉庫。如果你還沒有倉庫,請在 GitHub 上建立一個。倉庫準備就緒後,執行以下命令:
git add .
git commit -m "Initial commit with Prisma Postgres integration"
git branch -M main
git remote add origin https://github.com/<your-username>/<repository-name>.git
git push -u origin main注意將
<your-username>和<repository-name>替換為你的 GitHub 使用者名稱和倉庫名稱。 - 登入 Vercel 並導航到你的儀表盤。
- 建立一個新專案。按照 Vercel 的 匯入現有專案 指南操作,但在單擊部署之前,請在 步驟 3 處配置環境變數。
- 配置
DATABASE_URL環境變數- 展開環境變數部分。
- 新增
PPG_USER_DATABASE_URL環境變數- 鍵:
PPG_USER_DATABASE_URL - 值:貼上你的使用者資料庫連線 URL,例如,從你專案中的
.env檔案複製。
- 鍵:
- 新增
PPG_POST_DATABASE_URL環境變數- 鍵:
PPG_POST_DATABASE_URL - 值:貼上你的帖子資料庫連線 URL,例如,從你專案中的
.env檔案複製。
- 鍵:
警告未設定環境變數請勿部署。如果應用程式無法連線到資料庫,你的部署將失敗。
- 單擊部署按鈕。Vercel 將構建你的專案並將其部署到即時 URL。
開啟 Vercel 提供的即時 URL 並驗證你的應用程式是否正常工作。
恭喜!你已成功部署了一個使用多個 Prisma Client 查詢兩個不同資料庫的應用程式,它現在已在 Vercel 上線並全面執行。
後續步驟
在本指南中,你學習瞭如何在單個 Next.js 應用程式中使用 Prisma ORM 來操作多個數據庫,具體方法包括:
- 為使用者和帖子資料庫設定獨立的 Prisma 模式。
- 配置自定義輸出目錄和環境變數。
- 建立輔助指令碼來生成和遷移每個模式。
- 例項化多個 Prisma Client 並將其整合到你的應用程式中。
- 將你的多資料庫應用程式部署到 Vercel。
這種方法可以讓你保持資料模型的清晰分離,並簡化多租戶或多資料庫場景。
為了進一步改進專案管理,請考慮使用 monorepo 設定。檢視我們的相關指南:
與 Prisma 保持聯絡
透過以下方式與我們聯絡,繼續你的 Prisma 之旅: 我們活躍的社群。保持資訊更新,參與其中,並與其他開發者協作
- 在 X 上關注我們 獲取公告、直播活動和實用技巧。
- 加入我們的 Discord 提問、與社群交流並透過對話獲得積極支援。
- 在 YouTube 上訂閱 獲取教程、演示和直播。
- 在 GitHub 上互動 透過標星倉庫、報告問題或為問題貢獻程式碼。