跳至主要內容

如何在單一應用程式中使用多個資料庫

15 分鐘

簡介

本指南將展示如何在單一 Next.js 應用程式 中使用 Prisma ORM 來管理多個資料庫。您將學會如何連接兩個不同的 Prisma Postgres 資料庫、管理遷移(migrations),並將應用程式部署到 Vercel。此方法適用於多租戶(multi-tenant)應用程式,或是當您需要將多個資料庫連接的管理進行關注點分離時使用。

先決條件

在開始之前,請確保您已具備以下條件:

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_URLPPG_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

.env
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 目錄

prisma-user-database/schema.prisma
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 檔案。

prisma-user-database/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

.env
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 目錄

prisma-post-database/schema.prisma
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 檔案。

prisma-post-database/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 指令。

package.json
"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 中,加入以下程式碼:

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 中,加入此程式碼:

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 檔案:

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://:5555https://:5556。導覽至這些視窗並為兩個資料庫新增範例資料。

4.2. 執行開發伺服器

在啟動開發伺服器之前,請注意如果您使用的是 Next.js v15.2.0,請不要使用 Turbopack,因為目前存在一個已知的 問題。請透過更新 package.json 將 Turbopack 從您的 dev 指令碼中移除:

package.json
"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 應用程式顯示來自兩個資料庫的資料。

App displaying data by querying two separate database instances

恭喜!您已成功執行一個 Next.js 應用程式,並使用兩個 Prisma Client 實例分別查詢不同的資料庫。

5. 將使用多個資料庫的 Next.js 應用程式部署到 Vercel

請遵循以下步驟部署您的應用程式:

  1. 確保您的專案已進行版本控制並推送到 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 使用者名稱與儲存庫名稱。

  2. 登入 Vercel 並前往您的 儀表板 (Dashboard)
  3. 建立一個新專案。請依照 Vercel 的 匯入現有專案 (Import an existing project) 指南操作,但停在 步驟 3,在點擊「部署 (Deploy)之前配置環境變數。
  4. 配置 DATABASE_URL 環境變數。
    1. 展開「環境變數 (Environment variables)」區段。
    2. 新增 PPG_USER_DATABASE_URL 環境變數。
      • Key (鍵): PPG_USER_DATABASE_URL
      • Value (值): 貼上您的使用者資料庫連接 URL(例如從專案中的 .env 檔案複製)。
    3. 新增 PPG_POST_DATABASE_URL 環境變數。
      • Key (鍵): PPG_POST_DATABASE_URL
      • Value (值): 貼上您的文章資料庫連接 URL(例如從專案中的 .env 檔案複製)。
    警告

    在未設定環境變數的情況下請勿進行部署。如果應用程式無法連接到資料庫,部署將會失敗。

  5. 點擊「部署 (Deploy)」按鈕。Vercel 將會建置您的專案並部署至公開 URL。

開啟 Vercel 提供的公開 URL,確認您的應用程式運作正常。

恭喜!您已成功部署一個應用程式,它使用了多個 Prisma Client 來查詢兩個不同的資料庫,且目前已在 Vercel 上即時運作。

後續步驟

在本指南中,您學會了如何透過以下方式在單一 Next.js 應用程式中使用 Prisma ORM 存取多個資料庫:

  • 為使用者與文章資料庫分別設定獨立的 Prisma schema。
  • 配置自定義輸出目錄與環境變數。
  • 建立輔助指令碼以產生與遷移各個 schema。
  • 實例化多個 Prisma Client 並將其整合進應用程式中。
  • 將您的多資料庫應用程式部署到 Vercel。

此方法讓您能維持資料模型清楚的關注點分離,並簡化多租戶或多資料庫的開發場景。

若要進一步改善專案管理,請考慮使用 Monorepo 架構。查看我們相關的指南:


與 Prisma 保持聯繫

透過以下方式與我們聯繫,繼續您的 Prisma 旅程: 我們的活躍社群。保持資訊靈通、參與其中,並與其他開發者合作

我們衷心感謝您的參與,並期待您成為我們社群的一份子!

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