跳至主要内容

如何在单个应用程序中使用多个数据库

15 分钟

介绍

本指南将向您展示如何在单个 Next.js 应用程序中使用 Prisma ORM 访问多个数据库。您将学习如何连接到两个不同的 Prisma Postgres 数据库、管理迁移并将您的应用程序部署到 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 客户端

在本节中,您将创建两个独立的 Prisma Postgres 实例——一个用于用户数据,一个用于帖子数据。您还将为每个实例配置 Prisma 模式和环境变量。

首先,安装 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 客户端指定一个自定义 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

您的用户数据库模式现已准备就绪。

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 模型。此外,更新数据源 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'),
},
});

您的帖子数据库模式现已设置完成。

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 && 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:在安装依赖项后立即运行,使用各自的模式文件为用户数据库和帖子数据库生成 Prisma 客户端。
  • generate:手动触发为两个模式生成 Prisma 客户端,确保您的客户端代码反映最新的模型。
  • migrate:使用 Prisma Migrate 在开发模式下为两个数据库应用待处理的迁移,根据 Prisma 文件中的更改更新它们的模式。
  • deploy:在生产环境中执行迁移,使您的实时数据库与 Prisma 模式同步。
  • studio:同时在不同的端口(用户数据库为 5555,帖子数据库为 5556)打开两个数据库的 Prisma Studio,用于可视化数据管理。

运行迁移

npm run migrate

当提示时,为每个数据库命名迁移。

3. 准备应用程序以使用多个 Prisma 客户端

接下来,创建一个 lib 文件夹来存储用于实例化和导出您的 Prisma 客户端的辅助文件

mkdir -p lib && touch lib/user-prisma-client.ts lib/post-prisma-client.ts

3.1. 实例化并导出用户数据库的 Prisma 客户端

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 客户端

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 客户端

修改您的应用程序代码以从两个数据库中获取数据。如下更新 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 && 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 客户端实例,它们查询不同的数据库。

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 客户端查询两个不同数据库的应用程序,它现在已在 Vercel 上线并完全运行。

后续步骤

在本指南中,您学习了如何使用 Prisma ORM 在单个 Next.js 应用程序中使用多个数据库,具体方法如下:

  • 为用户和帖子数据库设置单独的 Prisma 模式。
  • 配置自定义输出目录和环境变量。
  • 创建辅助脚本来生成和迁移每个模式。
  • 实例化多个 Prisma 客户端并将其集成到您的应用程序中。
  • 将您的多数据库应用程序部署到 Vercel。

这种方法允许您保持数据模型的清晰分离,并简化多租户或多数据库场景。

为了进一步改进项目管理,请考虑使用 monorepo 设置。查看我们的相关指南


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

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