単一アプリで複数のデータベースを使用する方法
はじめに
このガイドでは、単一のNext.jsアプリでPrisma ORMを使用して複数のデータベースを使用する方法について説明します。ここでは、2つの異なるPrisma Postgresデータベースに接続し、マイグレーションを管理し、アプリケーションをVercelにデプロイする方法を学びます。このアプローチは、マルチテナントアプリケーションや、複数のデータベースへの接続を管理する際に懸念事項を分離する必要がある場合に役立ちます。
前提条件
始める前に、以下を用意してください。
- Node.js 18+ がインストールされていること。
- 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
- デフォルトのカスタムインポートエイリアス:
@/*
次に、プロジェクトディレクトリに移動します。
cd my-multi-client-app
2. データベースとPrisma Clientのセットアップ
このセクションでは、ユーザーデータ用と投稿データ用の2つの別々のPrisma Postgresインスタンスを作成します。また、それぞれのPrismaスキーマと環境変数を構成します。
まず、Prismaを開発依存関係としてインストールします。
npm install -D prisma
Prisma Client拡張機能をインストールします。これはPrisma Postgresを使用するために必要です。
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
フラグを使用しないでください。代わりに、2つの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. ヘルパースクリプトを追加し、スキーマをマイグレーションする
ワークフローを簡素化するために、両方のデータベースの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 Clientを生成します。generate
: Prisma Clientの生成を手動でトリガーし、クライアントコードが最新のモデルを反映するようにします。migrate
: Prisma Migrateを使用して、開発モードで両方のデータベースの保留中のマイグレーションを適用し、Prismaファイルの変更に基づいてスキーマを更新します。deploy
: 本番環境でマイグレーションを実行し、ライブデータベースをPrismaスキーマと同期させます。studio
: ユーザーデータベース用のポート(5555
)と投稿データベース用のポート(5556
)で、Prisma Studioを同時に開き、視覚的なデータ管理を行います。
マイグレーションを実行します。
npm run migrate
プロンプトが表示されたら、それぞれのデータベースのマイグレーションに適切な名前を付けます。
3. 複数のPrisma Clientを使用するようにアプリケーションを準備する
次に、Prisma Clientをインスタンス化してエクスポートするためのヘルパーファイルを格納するlib
フォルダーを作成します。
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. 複数のPrisma ClientをNext.jsアプリに統合する
両方のデータベースからデータを取得するようにアプリケーションコードを変更します。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の2つのインスタンスを開き、次のスクリプトを実行してデータベースにデータを追加します。
npm run studio
これにより、http://localhost:5555
とhttp://localhost:5556
に2つのブラウザウィンドウが開きます。これらのウィンドウに移動し、両方のデータベースにサンプルデータを追加します。
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
http://localhost:3000
に移動して、Next.jsアプリが両方のデータベースからデータを表示することを確認します。
おめでとうございます。2つの異なるデータベースにクエリを実行する2つのPrisma ClientインスタンスでNext.jsアプリが実行されました。
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を使用して2つの異なるデータベースにクエリを実行するアプリケーションをデプロイしました。これで、Vercelでライブかつ完全に運用可能になりました。
次のステップ
このガイドでは、単一のNext.jsアプリでPrisma ORMを使用して複数のデータベースを使用する方法を学びました。
- ユーザーデータベースと投稿データベース用に別々のPrismaスキーマをセットアップする。
- カスタム出力ディレクトリと環境変数を構成する。
- 各スキーマを生成およびマイグレーションするためのヘルパースクリプトを作成する。
- 複数のPrisma Clientをインスタンス化してアプリケーションに統合する。
- マルチデータベースアプリケーションをVercelにデプロイする。
このアプローチにより、データモデルの明確な分離を維持し、マルチテナントシナリオまたはマルチデータベースシナリオを簡素化できます。
プロジェクトの管理をさらに改善するには、モノレポのセットアップを検討してください。関連ガイドをご覧ください。
Prismaとのつながりを保つ
以下とつながることで、Prismaの旅を続けましょう。 活発なコミュニティ。最新情報を入手し、参加し、他の開発者と協力しましょう。
- Xでフォローしてください お知らせ、ライブイベント、役立つヒントをお届けします。
- Discordに参加してください 質問をしたり、コミュニティと話したり、会話を通じてアクティブなサポートを受けたりできます。
- YouTubeでチャンネル登録してください チュートリアル、デモ、ストリームをご覧ください。
- GitHubでエンゲージしてください リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりできます。