如何在單一應用程式中使用多個資料庫
簡介
本指南將展示如何在單一 Next.js 應用程式 中使用 Prisma ORM 來管理多個資料庫。您將學會如何連接兩個不同的 Prisma Postgres 資料庫、管理遷移(migrations),並將應用程式部署到 Vercel。此方法適用於多租戶(multi-tenant)應用程式,或是當您需要將多個資料庫連接的管理進行關注點分離時使用。
先決條件
在開始之前,請確保您已具備以下條件:
- 已安裝 Node.js 20+。
- 一個 Prisma Data Platform 帳號。
- 一個 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
- 預設自定義匯入別名(custom import alias):
@/*
接著,切換到專案目錄
cd my-multi-client-app
2. 設定您的資料庫與 Prisma Clients
在本節中,您將建立兩個獨立的 Prisma Postgres 實例——一個用於使用者資料,另一個用於文章資料。您也將針對兩者分別設定 Prisma schema 與環境變數。
首先,安裝 Prisma 以及所需的依賴套件:
npm install prisma tsx @types/pg --save-dev
npm install @prisma/client @prisma/adapter-pg dotenv pg
如果您使用的是不同的資料庫提供者(MySQL、SQL Server、SQLite),請安裝相應的驅動程式適配器套件,而不是 @prisma/adapter-pg。如需更多資訊,請參閱資料庫驅動程式。
您已安裝專案所需的依賴套件。
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檔案(例如:DATABASE_URL="postgresql://user:password@host:5432/database?sslmode=require")。
將 prisma 資料夾重新命名為 prisma-user-database。
mv prisma prisma-user-database
編輯您的 .env 檔案,將 DATABASE_URL 重新命名為 PPG_USER_DATABASE_URL。
DATABASE_URL="postgresql://user:password@host:5432/database?sslmode=require"
PPG_USER_DATABASE_URL="postgresql://user:password@host:5432/database?sslmode=require"
開啟 prisma-user-database/schema.prisma 檔案並進行更新以定義 User 模型。此外,設定環境變數並為產生的 Prisma Client 指定一個 自定義的 output 目錄。
generator client {
provider = "prisma-client"
output = "../prisma-user-database/user-database-client-types"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
為使用者資料庫建立一個 prisma.config.ts 檔案。
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config';
export default defineConfig({
schema: 'prisma-user-database/schema.prisma',
migrations: {
path: 'prisma-user-database/migrations',
},
datasource: {
url: env('PPG_USER_DATABASE_URL'),
},
});
如果您尚未安裝 dotenv 套件,則需要安裝它。
npm install dotenv
您的使用者資料庫 schema 現已準備就緒。
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="postgresql://user:password@host:5432/database?sslmode=require"
PPG_POST_DATABASE_URL="postgresql://user:password@host:5432/database?sslmode=require"
編輯 prisma-post-database/schema.prisma 檔案以定義 Post 模型。同時,更新 datasource URL 並設定一個 自定義的 output 目錄。
generator client {
provider = "prisma-client"
output = "../prisma-post-database/post-database-client-types"
}
datasource db {
provider = "postgresql"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
}
為文章資料庫建立一個 prisma.config.ts 檔案。
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config';
export default defineConfig({
schema: 'prisma-post-database/schema.prisma',
migrations: {
path: 'prisma-post-database/migrations',
},
datasource: {
url: env('PPG_POST_DATABASE_URL'),
},
});
您的文章資料庫 schema 現已設定完成。
2.3. 新增輔助指令碼並進行 Schema 遷移
為了簡化工作流程,請在 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 && npx prisma generate --schema ./prisma-post-database/schema.prisma",
"generate": "npx prisma generate --schema ./prisma-user-database/schema.prisma && npx prisma generate --schema ./prisma-post-database/schema.prisma",
"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"
}
以下是這些自定義指令碼的說明:
postinstall:在安裝依賴後立即執行,利用各自的 schema 檔案為使用者資料庫與文章資料庫產生對應的 Prisma Client。generate:手動觸發兩個 schema 的 Prisma Client 產生作業,確保您的客戶端程式碼反映最新的模型。migrate:使用 Prisma Migrate 在開發環境中為兩個資料庫套用待處理的遷移,根據 Prisma 檔案中的變更更新其 schema。deploy:在生產環境中執行遷移,將正式環境的資料庫與您的 Prisma schema 同步。studio:同時在不同的連接埠上(使用者資料庫為5555,文章資料庫為5556)開啟 Prisma Studio,以進行視覺化的資料管理。
執行遷移:
npm run migrate
當出現提示時,請分別為每個資料庫的遷移命名。
3. 準備應用程式以使用多個 Prisma Clients
接下來,建立一個 lib 資料夾,用於存放實例化與匯出 Prisma Clients 的輔助檔案。
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/client";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({
connectionString: process.env.PPG_USER_DATABASE_URL,
});
const getPrisma = () => new PrismaClient({
adapter,
});
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;
3.2. 實例化並匯出文章資料庫的 Prisma Client
在 lib/post-prisma-client.ts 中,加入此程式碼:
import { PrismaClient } from "../prisma-post-database/post-database-client-types/client";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({
connectionString: process.env.PPG_POST_DATABASE_URL,
});
const getPrisma = () => new PrismaClient({
adapter,
});
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;
4. 在 Next.js 應用程式中整合多個 Prisma Clients
修改您的應用程式程式碼以從兩個資料庫獲取資料。請依照以下方式更新 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 從您的 dev 指令碼中移除:
"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 && npx prisma generate --schema ./prisma-post-database/schema.prisma",
"generate": "npx prisma generate --schema ./prisma-user-database/schema.prisma && npx prisma generate --schema ./prisma-post-database/schema.prisma",
"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 並前往您的 儀表板 (Dashboard)。
- 建立一個新專案。請依照 Vercel 的 匯入現有專案 (Import an existing project) 指南操作,但停在 步驟 3,在點擊「部署 (Deploy)」之前配置環境變數。
- 配置
DATABASE_URL環境變數。- 展開「環境變數 (Environment variables)」區段。
- 新增
PPG_USER_DATABASE_URL環境變數。- Key (鍵):
PPG_USER_DATABASE_URL - Value (值): 貼上您的使用者資料庫連接 URL(例如從專案中的
.env檔案複製)。
- Key (鍵):
- 新增
PPG_POST_DATABASE_URL環境變數。- Key (鍵):
PPG_POST_DATABASE_URL - Value (值): 貼上您的文章資料庫連接 URL(例如從專案中的
.env檔案複製)。
- Key (鍵):
警告在未設定環境變數的情況下請勿進行部署。如果應用程式無法連接到資料庫,部署將會失敗。
- 點擊「部署 (Deploy)」按鈕。Vercel 將會建置您的專案並部署至公開 URL。
開啟 Vercel 提供的公開 URL,確認您的應用程式運作正常。
恭喜!您已成功部署一個應用程式,它使用了多個 Prisma Client 來查詢兩個不同的資料庫,且目前已在 Vercel 上即時運作。
後續步驟
在本指南中,您學會了如何透過以下方式在單一 Next.js 應用程式中使用 Prisma ORM 存取多個資料庫:
- 為使用者與文章資料庫分別設定獨立的 Prisma schema。
- 配置自定義輸出目錄與環境變數。
- 建立輔助指令碼以產生與遷移各個 schema。
- 實例化多個 Prisma Client 並將其整合進應用程式中。
- 將您的多資料庫應用程式部署到 Vercel。
此方法讓您能維持資料模型清楚的關注點分離,並簡化多租戶或多資料庫的開發場景。
若要進一步改善專案管理,請考慮使用 Monorepo 架構。查看我們相關的指南:
與 Prisma 保持聯繫
透過以下方式與我們聯繫,繼續您的 Prisma 旅程: 我們的活躍社群。保持資訊靈通、參與其中,並與其他開發者合作
- 在 X 上關注我們 以獲取公告、現場活動和實用技巧。
- 加入我們的 Discord 提出問題、與社群對話,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 查看教學、演示和直播。
- 在 GitHub 上交流 透過為存放庫加星標、報告問題或為 issue 做出貢獻。