pnpm ワークスペースモノレポで Prisma ORM を使用する方法
Prisma はデータベースを管理するための強力な ORM であり、pnpm Workspaces と組み合わせることで、無駄がなくモジュール化されたモノレポアーキテクチャを維持できます。このガイドでは、pnpm Workspaces モノレポ内の独自のパッケージに Prisma をセットアップする方法について説明し、アプリ全体で保守可能な型共有と効率的なデータベース管理を可能にします。
学習内容:
- pnpm Workspaces を使用してモノレポを初期化する方法。
- Prisma をスタンドアロンパッケージとして統合する手順。
- パッケージ間で Prisma Client を生成および共有する方法。
- Prisma パッケージをワークスペース内のアプリケーションに統合する。
1. プロジェクトを準備し、pnpm ワークスペースを設定する
Prisma を統合する前に、プロジェクト構造を設定する必要があります。まず、プロジェクトの新しいディレクトリ (例: my-monorepo
) を作成し、Node.js プロジェクトを初期化します。
mkdir my-monorepo
cd my-monorepo
pnpm init
次に、ワークスペース構造を定義し、Prisma のバージョンを固定するために `pnpm-workspace.yaml` ファイルを作成します。
touch pnpm-workspace.yaml
次の構成を `pnpm-workspace.yaml` に追加します。
packages:
- "apps/*"
- "packages/*"
catalogs:
prisma:
prisma: latest
最後に、アプリケーションと共有パッケージのディレクトリを作成します。
mkdir apps
mkdir -p packages/database
2. 共有データベースパッケージのセットアップ
このセクションでは、Prisma を使用するスタンドアロンのデータベースパッケージの作成について説明します。このパッケージには、すべてのデータベースモデルと生成された Prisma Client が含まれており、モノレポ全体で再利用できます。
2.1. パッケージの初期化と依存関係のインストール
packages/database
ディレクトリに移動し、新しいパッケージを初期化します。
cd packages/database
pnpm init
ピン留めされた catalog
を使用して、Prisma を開発依存関係として `package.json` に追加します。
"devDependencies": {
"prisma": "catalog:prisma"
}
次に、Prisma をインストールします。
pnpm install
次に、追加の依存関係を追加します。
pnpm add typescript tsx @types/node -D
次に、Prisma Postgres を使用するために必要な Prisma Client 拡張機能をインストールします。
pnpm add @prisma/extension-accelerate
このガイドでは、Prisma Postgres を使用します。別のデータベースを使用する場合は、@prisma/extension-accelerate package を省略できます。
`database` パッケージの `tsconfig.json` ファイルを初期化します。
pnpm tsc --init
2.2. データベースパッケージに Prisma ORM をセットアップする
次のコマンドを実行して、database
パッケージで Prisma Postgres のインスタンスを使用して Prisma ORM を初期化します。
pnpm prisma init --db
プロジェクトの名前を入力し、データベースリージョンを選択します。
このガイドでは、Prisma Postgres を使用します。Prisma Postgres データベースを使用していない場合は、--db
フラグを追加する必要はありません。
このコマンドは
- CLI をアカウントに接続します。ログインしていない場合、またはアカウントをお持ちでない場合は、ブラウザが開いて、新しいアカウントの作成または既存のアカウントへのサインインをガイドします。
- データベースモデル用の `schema.prisma` ファイルを含む `prisma` ディレクトリを作成します。
- `DATABASE_URL` を含む `.env` ファイルを作成します (例: Prisma Postgres の場合、
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..."
のようなものが必要です)。
`schema.prisma` ファイルを編集して、データベースに `User` モデルを定義し、Prisma Client を生成するための カスタム output
ディレクトリを指定します。これにより、生成された型が正しく解決されるようになります。
generator client {
provider = "prisma-client-js"
output = "../generated/client"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
次に、Prisma コマンドを簡素化するために、ヘルパースクリプトを `package.json` に追加します。
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"db:generate": "prisma generate --no-engine",
"db:migrate": "prisma migrate dev",
"db:deploy": "prisma migrate deploy",
"db:studio": "prisma studio"
}
}
データベースに Prisma Postgres を使用していない場合は、db:generate
スクリプトから --no-engine
フラグを除外してください。
Prisma Migrate を使用してデータベースの変更を移行します。
pnpm run db:migrate
CLI からプロンプトが表示されたら、移行のわかりやすい名前を入力します。
移行が成功したら、Accelerate 拡張機能で Prisma Client を初期化するための `client.ts` ファイルを作成します。
import { PrismaClient } from "./generated/client";
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
const globalForPrisma = global as unknown as { prisma: typeof prisma }
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
export { prisma };
データベースに Prisma Postgres を使用していない場合は、import { withAccelerate }
行とそれに続く行の .$extends(withAccelerate())
を除外してください。
次に、Prisma Client のインスタンスとすべての生成された型を再エクスポートするための `index.ts` ファイルを作成します。
export { prisma } from "./client";
export * from "./generated/client";
この時点で、共有データベースパッケージは完全に構成され、モノレポ全体で使用できるようになります。
3. フロントエンドアプリケーションのセットアップと統合
データベースパッケージがセットアップされたので、共有 Prisma Client を使用してデータベースと対話するフロントエンドアプリケーション (Next.js を使用) を作成します。
3.1. Next.js アプリケーションのブートストラップ
`apps` ディレクトリに移動します。
cd ../../apps
`web` という名前の新しい Next.js アプリを作成します。
pnpm create next-app@latest web --yes
--yes
フラグは、Next.js アプリをブートストラップするためのデフォルト構成を使用します (このガイドでは、src/
ディレクトリとインストーラーとして pnpm
を使用しない app router を使用します)。
さらに、このフラグは、web
フォルダーに Git リポジトリを自動的に初期化する場合があります。その場合は、rm -r .git
を実行して .git
ディレクトリを削除してください。
次に、web ディレクトリに移動します。
cd web/
同じ環境変数が利用可能であることを確認するために、データベースパッケージから `.env` ファイルをコピーします。
cp ../../packages/database/.env .
Next.js アプリの `package.json` ファイルを開き、共有 database
パッケージを依存関係として追加します。
"dependencies": {
"database": "workspace:*",
// additional dependencies
// ...
}
次のコマンドを実行して、database
パッケージをインストールします。
pnpm install
3.2. 共有 database
パッケージをアプリコードに統合する
データベースパッケージから Prisma Client を使用するように Next.js アプリケーションコードを変更します。`app/page.tsx` を次のように更新します。
import { prisma } from "database";
export default async function Home() {
const user = await prisma.user.findFirst({
select: {
name: true
}
})
return (
<div>
{user?.name && <p>Hello from {user.name}</p>}
{!user?.name && <p>No user has been added to the database yet. </p>}
</div>
);
}
このコードは、共有 Prisma Client をインポートして使用し、User
モデルをクエリする方法を示しています。
3.3. ヘルパースクリプトを追加してアプリケーションを実行する
モノレポのルート `package.json` に次のスクリプトを追加します。これらは、データベースの移行、型生成、およびアプリのビルドが適切な順序で実行されるようにします。
"scripts": {
"build": "pnpm --filter database db:deploy && pnpm --filter database db:generate && pnpm --filter web build",
"start": "pnpm --filter web start",
"dev": "pnpm --filter database db:generate && pnpm --filter web dev",
"studio": "pnpm --filter database db:studio"
}
3.4. アプリケーションを実行する
次に、モノレポのルートに戻ります。
cd ../../
次を実行して開発サーバーを起動します。
pnpm run dev
ブラウザで http://localhost:3000
を開き、アプリが動作していることを確認します。
3.5. (オプション) Prisma Studio を使用してデータベースにデータを追加する
まだデータベースにデータがないはずです。CLI で pnpm run studio
を実行して、Prisma Studio を http://localhost:5555
で起動し、データベースを操作してデータを追加できます。
次のステップ
これで、Prisma ORM を効果的に使用するモノレポを作成し、共有データベースパッケージを Next.js アプリケーションに統合しました。
さらに深く掘り下げてセットアップを強化するには、Prisma ORM を Turborepo で使用する方法ガイドを読むことを検討してください。
Prisma とのつながりを保つ
とつながって、Prisma の旅を続けましょう アクティブなコミュニティ。常に情報を入手し、参加し、他の開発者と協力しましょう。
- X でフォローしてください お知らせ、ライブイベント、役立つヒントをお届けします。
- Discord に参加してください 質問したり、コミュニティと話したり、会話を通じて積極的なサポートを得たりできます。
- YouTube でチャンネル登録 チュートリアル、デモ、ストリームをご覧ください。
- GitHub で交流 リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしてください。