跳到主要內容

如何在單個應用程式中使用多個數據庫

15 分鐘

簡介

本指南將向你展示如何在單個 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_URLPPG_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

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

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

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

prisma-post-database/schema.prisma
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 命令

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 --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 中,新增以下程式碼

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 中,新增以下程式碼

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

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

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

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 並導航到你的儀表盤
  3. 建立一個新專案。按照 Vercel 的 匯入現有專案 指南操作,但在單擊部署之前,請在 步驟 3 處配置環境變數。
  4. 配置 DATABASE_URL 環境變數
    1. 展開環境變數部分。
    2. 新增 PPG_USER_DATABASE_URL 環境變數
      • PPG_USER_DATABASE_URL
      • :貼上你的使用者資料庫連線 URL,例如,從你專案中的 .env 檔案複製。
    3. 新增 PPG_POST_DATABASE_URL 環境變數
      • PPG_POST_DATABASE_URL
      • :貼上你的帖子資料庫連線 URL,例如,從你專案中的 .env 檔案複製。
    警告

    未設定環境變數請勿部署。如果應用程式無法連線到資料庫,你的部署將失敗。

  5. 單擊部署按鈕。Vercel 將構建你的專案並將其部署到即時 URL。

開啟 Vercel 提供的即時 URL 並驗證你的應用程式是否正常工作。

恭喜!你已成功部署了一個使用多個 Prisma Client 查詢兩個不同資料庫的應用程式,它現在已在 Vercel 上線並全面執行。

後續步驟

在本指南中,你學習瞭如何在單個 Next.js 應用程式中使用 Prisma ORM 來操作多個數據庫,具體方法包括:

  • 為使用者和帖子資料庫設定獨立的 Prisma 模式。
  • 配置自定義輸出目錄和環境變數。
  • 建立輔助指令碼來生成和遷移每個模式。
  • 例項化多個 Prisma Client 並將其整合到你的應用程式中。
  • 將你的多資料庫應用程式部署到 Vercel。

這種方法可以讓你保持資料模型的清晰分離,並簡化多租戶或多資料庫場景。

為了進一步改進專案管理,請考慮使用 monorepo 設定。檢視我們的相關指南:


與 Prisma 保持聯絡

透過以下方式與我們聯絡,繼續你的 Prisma 之旅: 我們活躍的社群。保持資訊更新,參與其中,並與其他開發者協作

我們真誠地重視你的參與,並期待你成為我們社群的一員!

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