メインコンテンツへスキップ

TurborepoでPrisma ORMを使う方法

15分

Prismaはデータベース管理のための強力なORMであり、Turborepoはモノレポのワークフローを簡素化します。これらのツールを組み合わせることで、プロジェクトにスケーラブルでモジュール化されたアーキテクチャを構築できます。

このガイドでは、PrismaをTurborepoモノレポ内のスタンドアロンパッケージとしてセットアップする方法を紹介し、複数のアプリケーションにわたる効率的な設定、型共有、データベース管理を可能にします。

学習内容:

  • TurborepoモノレポでPrismaをセットアップする方法。
  • PrismaClientを生成し、パッケージ間で再利用する手順。
  • Prismaパッケージをモノレポ内の他のアプリケーションに統合する方法。

前提条件

1. プロジェクトのセットアップ

turborepo-prismaという名前のTurborepoモノレポをセットアップするには、次のコマンドを実行します

npx create-turbo@latest turborepo-prisma

パッケージマネージャーを選択するよう求められますが、このガイドではnpmを使用します

情報
  • どのパッケージマネージャーを使用しますか? npm

セットアップ後、プロジェクトのパッケージマネージャーを選択します。プロジェクトのルートディレクトリに移動し、Turborepoを開発依存関係としてインストールします

cd turborepo-prisma
npm install turbo --save-dev

Turborepoのインストールに関する詳細については、公式Turborepoガイドを参照してください。

2. モノレポに新しいdatabaseパッケージを追加する

2.1 パッケージを作成し、Prismaをインストールする

packagesディレクトリ内にdatabaseパッケージを作成します。次に、以下のコマンドを実行して、そのパッケージのpackage.jsonファイルを作成します

cd packages/
mkdir database
cd database
touch package.json

package.jsonファイルを次のように定義します

packages/database/package.json
{
"name": "@repo/db",
"version": "0.0.0"
}

次に、Prisma ORMを使用するために必要な依存関係をインストールします。お好みのパッケージマネージャーを使用してください

npm install prisma --save-dev
npm install @prisma/client

Prisma Postgresを使用している場合、@prisma/extension-accelerateパッケージをインストールしてください。

npm install @prisma/extension-accelerate

2.2. Prismaを初期化し、モデルを定義する

databaseディレクトリ内で、次のコマンドを実行してPrismaを初期化します

npx 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ファイルに、以下のモデルを追加します

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にいくつかのスクリプトを追加しましょう

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が環境に追加されていることを確認しましょう

turbo.json
{
"$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をマイグレーションし、型を生成する

プロジェクトルートに移動し、次のコマンドを実行してデータベースを自動的にマイグレーションします

npx turbo db:migrate

prisma.schemaを生成する

Prismaスキーマから型を生成するには、プロジェクトルートから以下を実行します

npx turbo db:generate

2.4. Prismaクライアントと型をエクスポートする

次に、生成された型とPrismaClientのインスタンスをエクスポートして、アプリケーションで使用できるようにします。

packages/databaseディレクトリ内に、srcフォルダを作成し、client.tsファイルを追加します。このファイルはPrismaClientのインスタンスを定義します

packages/database/src/client.ts
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;

次に、srcフォルダにindex.tsファイルを作成し、生成されたPrisma型とPrismaClientインスタンスを再エクスポートします

packages/database/src/index.ts
export { prisma } from './client' // exports instance of prisma 
export * from "../generated/prisma" // exports generated types from prisma

Just-in-Timeパッケージングパターンに従い、packages/database/package.json内にパッケージのエントリポイントを作成します

警告

バンドラーを使用しない場合は、代わりにコンパイル済みパッケージ戦略を使用してください。

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/webwebというアプリがあるはずです。database依存関係をapps/web/package.jsonに追加します

{
// ...
"dependencies": {
"@repo/db": "*"
// ...
}
// ...
}

apps/webディレクトリ内でパッケージマネージャーのインストールコマンドを実行します

cd apps/web
npm install

webアプリで、databaseパッケージからインスタンス化されたprismaクライアントをインポートしましょう。

apps/web/appディレクトリ内で、page.tsxファイルを開き、以下のコードを追加します

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ファイルの内容をコピーします

apps/web/.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:generatedb:deployスクリプトは、モノレポのセットアップにはまだ最適化されていませんが、devbuildタスクには不可欠です。

新しい開発者がdb:generateを最初に実行せずにアプリケーションでturbo devを実行すると、エラーが発生します。

これを防ぐため、devまたはbuildを実行する前に必ずdb:generateが実行されるようにしてください。さらに、db:buildの前にdb:deploydb:generateの両方が実行されるようにしてください。turbo.jsonファイルでこれを設定する方法は以下の通りです

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を削除してください

apps/web/package.json
"script":{
"dev": "next dev --port 3000",
}

次に、プロジェクトルートからプロジェクトを実行します

npx turbo run dev --filter=web

https://:3000にアクセスすると、次のメッセージが表示されるはずです

No user added yet

シードスクリプトを作成するか、Prisma Studioを使用して手動でユーザーをデータベースに追加できます。

GUIを介して手動でデータを追加するためにPrisma Studioを使用するには、packages/databaseディレクトリ内に移動し、パッケージマネージャーを使用してprisma studioを実行します

npx prisma studio

このコマンドは、https://:5555でGUI付きのサーバーを起動し、データを表示および変更できるようにします。

おめでとうございます、TurborepoのPrismaのセットアップが完了しました!

次のステップ

  • より複雑なデータ関連を処理するために、Prismaモデルを拡張します。
  • アプリケーションの機能を強化するために、追加のCRUD操作を実装します。
  • アプリケーションをどのようにスケールできるかについては、Prisma Postgresを確認してください。

詳細情報


Prismaとの繋がりを保つ

以下とつながることでPrismaの旅を続けましょう 私たちの活発なコミュニティ。情報を入手し、参加し、他の開発者と協力しましょう

皆様のご参加を心より歓迎し、コミュニティの一員としてお迎えできることを楽しみにしています!

© . All rights reserved.