API / Option

select

Prisma クエリで取得するフィールドを明示的に指定するオプション。不要なフィールドを除外してover-fetching を防ぐ。

prismaqueryselectfieldsperformance
所属:Prisma Client

代表的な値 / 使い方

  • select: { id: true, title: true }
  • select: { id: true, author: { select: { name: true } } }
  • select: { _count: { select: { posts: true } } }

注意点 / Pitfalls

  • ·include と select は同一クエリの同一レベルで併用できない(どちらかを選ぶ)
  • ·リレーション先も絞り込むにはネストした select を使う
  • ·select を省略すると全フィールドが返るため、不要なカラムが多いテーブルでは over-fetching になりやすい
  • ·select 後の戻り値の型は Prisma が自動推論するが、型エラーになる場合は Prisma.PostGetPayload を使う

一緒に使う項目

補足

include はリレーションの全フィールドを取得、select は指定フィールドだけを取得。パフォーマンスを意識する場合や API レスポンスのサイズを絞りたい場合は select を選ぶ。

何をするオプションか

select は Prisma クエリで取得するフィールドを明示的に指定するオプションです。省略すると全フィールドが返りますが、select を使えば必要な列だけに絞れます。

// id と title だけを取得
prisma.post.findMany({
  select: { id: true, title: true },
});

どんな場面で使うか

  • API レスポンスに含めるフィールドを最小限に抑えたいとき
  • パスワードハッシュや機密フィールドを誤って返さないようにしたいとき
  • リレーション先から特定フィールドだけ取得したいとき(ネスト select

よくある組み合わせ

リレーション先のフィールドを絞る(ネスト select)

prisma.post.findMany({
  select: {
    id: true,
    title: true,
    author: {
      select: { name: true }, // リレーション先も絞れる
    },
  },
});

include: { author: true } だと著者の全フィールドが返りますが、ネスト select なら name だけに絞れます。

_count でリレーション件数を取得

prisma.user.findMany({
  select: {
    id: true,
    name: true,
    _count: { select: { posts: true } }, // 投稿数だけ
  },
});

include との違い

selectinclude
通常フィールド指定したものだけすべて返る
リレーションネスト select で絞れる全フィールドが返る
同一レベルでの併用不可(どちらか一方)不可(どちらか一方)

リレーション先のフィールドも絞りたい場合は include ではなく select + ネスト select を選びます。

注意点

  • includeselect は同一クエリの同一レベルで併用できない。TypeScript の型エラーで気づける
  • select を使うと戻り値の型が自動的に絞り込まれる。型が複雑になる場合は Prisma.PostGetPayload<{ select: ... }> で明示する
  • ネストが深い select はクエリが読みにくくなる。深さ 2 段を超えたら関数や型エイリアスに切り出す

関連サンプルの見どころ

  • prisma-relation-query: selectinclude の使い分けをモデルで比較するパターン
  • prisma-keyword-search-query: select でレスポンスフィールドを最小化するパターン
  • prisma-sort-query: Route Handler での select + orderBy の組み合わせ

selectinclude の違いを比較でまとめたページもあります → select vs include

関連ドキュメント

関連サンプル

同じテーマや技術スタックを使った実装例