TurborepoでPrisma ORMを使う方法
Prismaはデータベース管理のための強力なORMであり、Turborepoはモノレポのワークフローを簡素化します。これらのツールを組み合わせることで、プロジェクトにスケーラブルでモジュール化されたアーキテクチャを構築できます。
このガイドでは、PrismaをTurborepoモノレポ内のスタンドアロンパッケージとしてセットアップする方法を紹介し、複数のアプリケーションにわたる効率的な設定、型共有、データベース管理を可能にします。
学習内容:
- TurborepoモノレポでPrismaをセットアップする方法。
- PrismaClientを生成し、パッケージ間で再利用する手順。
- Prismaパッケージをモノレポ内の他のアプリケーションに統合する方法。
前提条件
1. プロジェクトのセットアップ
turborepo-prisma
という名前のTurborepoモノレポをセットアップするには、次のコマンドを実行します
npx create-turbo@latest turborepo-prisma
パッケージマネージャーを選択するよう求められますが、このガイドではnpm
を使用します
- どのパッケージマネージャーを使用しますか?
npm
セットアップ後、プロジェクトのパッケージマネージャーを選択します。プロジェクトのルートディレクトリに移動し、Turborepoを開発依存関係としてインストールします
- npm
- yarn
- pnpm
cd turborepo-prisma
npm install turbo --save-dev
cd turborepo-prisma
yarn add turbo --dev --ignore-workspace-root-check
cd turborepo-prisma
pnpm add turbo --save-dev --ignore-workspace-root-check
Turborepoのインストールに関する詳細については、公式Turborepoガイドを参照してください。
2. モノレポに新しいdatabase
パッケージを追加する
2.1 パッケージを作成し、Prismaをインストールする
packages
ディレクトリ内にdatabase
パッケージを作成します。次に、以下のコマンドを実行して、そのパッケージのpackage.json
ファイルを作成します
cd packages/
mkdir database
cd database
touch package.json
package.json
ファイルを次のように定義します
{
"name": "@repo/db",
"version": "0.0.0"
}
次に、Prisma ORMを使用するために必要な依存関係をインストールします。お好みのパッケージマネージャーを使用してください
- npm
- yarn
- pnpm
npm install prisma --save-dev
npm install @prisma/client
yarn add prisma --dev
yarn add @prisma/client
pnpm add prisma --save-dev
pnpm add @prisma/client
Prisma Postgresを使用している場合、@prisma/extension-accelerate
パッケージをインストールしてください。
- npm
- yarn
- pnpm
npm install @prisma/extension-accelerate
yarn add @prisma/extension-accelerate
pnpm add @prisma/extension-accelerate
2.2. Prismaを初期化し、モデルを定義する
database
ディレクトリ内で、次のコマンドを実行してPrismaを初期化します
- npm
- yarn
- pnpm
npx prisma init --db --output ../generated/prisma
yarn prisma init --db --output ../generated/prisma
pnpm prisma init --db --output ../generated/prisma
これにより、packages/database
内にいくつかのファイルが作成されます
schema.prisma
ファイルを含むprisma
ディレクトリ。- Prisma Postgresデータベース。
- プロジェクトルートに
DATABASE_URL
を含む.env
ファイル。 - 生成されたPrisma Clientのための
output
ディレクトリとしてgenerated/prisma
。
packages/database/prisma/schema.prisma
ファイルに、以下のモデルを追加します
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
}
../generated/prisma
はプラットフォーム固有のバイナリを含んでおり、異なる環境間で互換性の問題を引き起こす可能性があるため、.gitignore
ファイルに追加することをお勧めします。
カスタムディレクトリにPrisma型を生成することの重要性
schema.prisma
ファイルでは、Prismaが型を生成するカスタムのoutput
パスを指定します。これにより、異なるパッケージマネージャー間でPrismaの型が正しく解決されるようになります。
このガイドでは、型はdatabase/generated/prisma
ディレクトリに生成されます。
2.3. スクリプトを追加し、マイグレーションを実行する
packages/database
内のpackage.json
にいくつかのスクリプトを追加しましょう
{
"name": "@repo/db",
"version": "0.0.0",
"scripts": {
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev --skip-generate",
"db:deploy": "prisma migrate deploy"
},
"devDependencies": {
"prisma": "^6.6.0"
},
"dependencies": {
"@prisma/client": "^6.6.0"
}
}
これらのスクリプトをルートのturbo.json
にも追加し、DATABASE_URL
が環境に追加されていることを確認しましょう
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"cache": false,
"persistent": true
},
"db:generate": {
"cache": false
},
"db:migrate": {
"cache": false,
"persistent": true // This is necessary to interact with the CLI and assign names to your database migrations.
},
"db:deploy": {
"cache": false
}
}
prisma.schema
をマイグレーションし、型を生成する
プロジェクトルートに移動し、次のコマンドを実行してデータベースを自動的にマイグレーションします
- npm
- yarn
- pnpm
npx turbo db:migrate
yarn turbo db:migrate
pnpm turbo db:migrate
prisma.schema
を生成する
Prismaスキーマから型を生成するには、プロジェクトルートから以下を実行します
- npm
- yarn
- pnpm
npx turbo db:generate
yarn turbo db:generate
pnpm turbo db:generate
2.4. Prismaクライアントと型をエクスポートする
次に、生成された型とPrismaClient
のインスタンスをエクスポートして、アプリケーションで使用できるようにします。
packages/database
ディレクトリ内に、src
フォルダを作成し、client.ts
ファイルを追加します。このファイルはPrismaClient
のインスタンスを定義します
- Prisma Postgres(推奨)
- その他のデータベース
import { PrismaClient } from "../generated/prisma";
import { withAccelerate } from "@prisma/extension-accelerate";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma || new PrismaClient().$extends(withAccelerate());
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
import { PrismaClient } from "../generated/prisma";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma || new PrismaClient();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
次に、src
フォルダにindex.ts
ファイルを作成し、生成されたPrisma型とPrismaClient
インスタンスを再エクスポートします
export { prisma } from './client' // exports instance of prisma
export * from "../generated/prisma" // exports generated types from prisma
Just-in-Timeパッケージングパターンに従い、packages/database/package.json
内にパッケージのエントリポイントを作成します
バンドラーを使用しない場合は、代わりにコンパイル済みパッケージ戦略を使用してください。
{
"name": "@repo/db",
"version": "0.0.0",
"scripts": {
"db:generate": "npx prisma generate",
"db:migrate": "npx prisma migrate dev --skip-generate",
"db:deploy": "npx prisma migrate deploy"
},
"devDependencies": {
"prisma": "^6.6.0"
},
"dependencies": {
"@prisma/client": "^6.6.0"
},
"exports": {
".": "./src/index.ts"
}
}
これらの手順を完了すると、Prismaの型とPrismaClient
インスタンスがモノレポ全体でアクセス可能になります。
3. ウェブアプリでdatabase
パッケージをインポートする
turborepo-prisma
プロジェクトには、apps/web
にweb
というアプリがあるはずです。database
依存関係をapps/web/package.json
に追加します
- npm
- yarn
- pnpm
{
// ...
"dependencies": {
"@repo/db": "*"
// ...
}
// ...
}
{
// ...
"dependencies": {
"@repo/db": "*"
// ...
}
// ...
}
{
// ...
"dependencies": {
"@repo/db": "workspace:*"
// ...
}
// ...
}
apps/web
ディレクトリ内でパッケージマネージャーのインストールコマンドを実行します
- npm
- yarn
- pnpm
cd apps/web
npm install
cd apps/web
yarn install
cd apps/web
pnpm install
web
アプリで、database
パッケージからインスタンス化されたprisma
クライアントをインポートしましょう。
apps/web/app
ディレクトリ内で、page.tsx
ファイルを開き、以下のコードを追加します
import styles from "./page.module.css";
import { prisma } from "@repo/db";
export default async function Home() {
const user = await prisma.user.findFirst()
return (
<div className={styles.page}>
{user?.name ?? "No user added yet"}
</div>
);
}
次に、web
ディレクトリに.env
ファイルを作成し、/database
ディレクトリにあるDATABASE_URL
を含む.env
ファイルの内容をコピーします
DATABASE_URL="Same database url as used in the database directory"
Turborepoのセットアップで、アプリやパッケージ全体でルートディレクトリにある単一の.env
ファイルを使用したい場合は、dotenvx
のようなパッケージの使用を検討してください。
これを実装するには、各パッケージまたはアプリのpackage.json
ファイルを更新して、共有の.env
ファイルから必要な環境変数がロードされるようにします。詳細な手順については、Turborepo向けdotenvx
ガイドを参照してください。
モジュール性を促進し、潜在的な競合を避けるため、Turborepoは各パッケージに個別の.env
ファイルを使用することを推奨していることに留意してください。
4. Turborepoでタスクの依存関係を設定する
db:generate
とdb:deploy
スクリプトは、モノレポのセットアップにはまだ最適化されていませんが、dev
とbuild
タスクには不可欠です。
新しい開発者がdb:generate
を最初に実行せずにアプリケーションでturbo dev
を実行すると、エラーが発生します。
これを防ぐため、dev
またはbuild
を実行する前に必ずdb:generate
が実行されるようにしてください。さらに、db:build
の前にdb:deploy
とdb:generate
の両方が実行されるようにしてください。turbo.json
ファイルでこれを設定する方法は以下の通りです
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build", "^db:generate"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"dependsOn": ["^db:generate"],
"cache": false,
"persistent": true
},
"db:generate": {
"cache": false
},
"db:migrate": {
"cache": false,
"persistent": true
},
"db:deploy": {
"cache": false
}
}
}
5. 開発環境でプロジェクトを実行する
開発サーバーを起動する前に、Next.js v15.2.0を使用している場合は、既知の問題があるため、Turbopackを使用しないでください。apps/web/package.json
を更新して、devスクリプトからTurbopackを削除してください
"script":{
"dev": "next dev --port 3000",
}
次に、プロジェクトルートからプロジェクトを実行します
- npm
- yarn
- pnpm
npx turbo run dev --filter=web
yarn turbo run dev --filter=web
pnpm turbo run dev --filter=web
https://:3000
にアクセスすると、次のメッセージが表示されるはずです
No user added yet
シードスクリプトを作成するか、Prisma Studioを使用して手動でユーザーをデータベースに追加できます。
GUIを介して手動でデータを追加するためにPrisma Studioを使用するには、packages/database
ディレクトリ内に移動し、パッケージマネージャーを使用してprisma studio
を実行します
- npm
- yarn
- pnpm
npx prisma studio
yarn prisma studio
pnpm prisma studio
このコマンドは、https://:5555でGUI付きのサーバーを起動し、データを表示および変更できるようにします。
おめでとうございます、TurborepoのPrismaのセットアップが完了しました!
次のステップ
- より複雑なデータ関連を処理するために、Prismaモデルを拡張します。
- アプリケーションの機能を強化するために、追加のCRUD操作を実装します。
- アプリケーションをどのようにスケールできるかについては、Prisma Postgresを確認してください。
詳細情報
Prismaとの繋がりを保つ
以下とつながることでPrismaの旅を続けましょう 私たちの活発なコミュニティ。情報を入手し、参加し、他の開発者と協力しましょう
- Xでフォローする お知らせ、ライブイベント、役立つヒントのために。
- Discordに参加する 質問したり、コミュニティと話したり、会話を通じて積極的なサポートを受けたりできます。
- YouTubeを購読する チュートリアル、デモ、ストリームのために。
- GitHubでエンゲージする リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりすることで。