5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prisma Clientの仕組みを調べてみた

Last updated at Posted at 2025-09-02

はじめに

Prismaを使って開発していると登場する「Prisma Client」
このツールは 型安全で強力なORM ですが、その裏側で何が行われているのか、なぜ「generate」が必要なのか疑問に思ったことはありませんか?

この記事では、Prisma Client の生成の仕組みとその重要性について、調べてみました。


Prisma Clientとは?

Prisma Client とは、schema.prisma に定義されたモデルをもとに自動生成される TypeScriptベースのORMクライアントです。

例えば次のように、TypeScriptから簡単にDBアクセスができます:

const users = await prisma.user.findMany({
  where: { email: "test@example.com" }
});

このコードはただのORMではありません。型安全であり、VSCodeなどのIDEで強力な補完が効くのが特徴です。


なぜ「生成」する必要があるの?

Prismaは「スキーマ駆動開発」を推進しています。

  • あなたが定義した schema.prisma を元にPrisma CLI が @prisma/client 内に型付きクライアントを生成します
  • このクライアントを使ってDB操作を行います

つまり、スキーマを更新しただけではクライアント側に反映されないため、prisma generate で明示的に再生成が必要になります。

npx prisma generate

このコマンドで Prisma Client のコードが更新されます。


Prisma Client生成プロセスの詳細

1. schema.prisma の内容を読み込む

開発者が記述した Prisma スキーマには、モデルやデータソース、出力先が定義されています。

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

これが Prisma にとっての設計図です。


2. CLIがスキーマを解析する

npx prisma generate を実行すると、CLIは schema.prisma を読み込んでモデル情報やリレーションを抽象構文木(AST)に変換します。

ここで、たとえば「User と Post は 1対多」などの情報を正しく把握します。


3. Prisma Engine が作動

PrismaのRust製エンジン(Prisma Engine)が動作し、対象のDB(MySQL/PostgreSQL等)に対応したクエリコードを生成します。

const users = await prisma.user.findMany({
  where: { email: { contains: "@example.com" } }
});

このようなクエリを実行するための内部コードが、エンジン側で最適化されます。


4. TypeScript型を生成

モデル定義に基づいて、以下のような型が自動生成されます:

export type User = {
  id: number
  name: string
  email: string | null
  posts: Post[]
}

これにより、コンパイル時に型エラーを検出できるようになります。


5. @prisma/client に出力

最終的に、クライアントコードは node_modules/@prisma/client に格納されます。

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

このようにインポートして使用することで、型補完された安全なDB操作が可能になります。


Prisma Client が型安全な理由

  • Prisma Clientは、DB構造に応じた正確な型情報を生成します
  • 型ミス(存在しないフィールドへのアクセスなど)を開発時に検出できます
// 存在しないフィールド 'mail' にアクセスしようとするとエラー
const users = await prisma.user.findMany({
  where: { mail: "test@example.com" } // エラーになる
});

Prisma CLI の関連コマンド

コマンド 概要
npx prisma init Prismaプロジェクトの初期化
npx prisma generate Prisma Clientの生成・更新
npx prisma migrate dev マイグレーションの作成・適用(開発用)
npx prisma db push スキーマをDBに直接反映(軽量用途)

migrate devdb push 実行時には generate も自動で走ります。


図解

上記でのフローをまとめルト下記のようになります。

schema.prisma
     ↓
prisma generate
     ↓
node_modules/@prisma/client にコード生成
     ↓
TypeScript で安全に DB アクセス

Prisma Client Generation


まとめ

  • Prisma Client は schema.prisma から自動生成される型安全なORMクライアント
  • prisma generate を実行しないと変更が反映されない
  • エディタ補完・型チェックで開発体験が非常に良い
  • 他ORMと比べても 安全性・生産性が高い

参考リンク

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?