🗄️

Prismaで不要なカラムを除外する方法

に公開

Prismaでデータ取得時に不要な列を除外し、セキュリティリスクを軽減する方法を紹介します。

検証バージョン: Prisma 5.14.0

サンプルスキーマ

// schema.prisma
model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String
}

方法1: 対策なし(非推奨)

const users = await prisma.user.findMany();

問題点: idnameemailのすべての列が取得されます。意図せずemailなどの機密情報が含まれ、情報漏洩のリスクがあります。

方法2: selectで明示的に指定

const users = await prisma.user.findMany({
  select: {
    id: true,
    name: true,
  },
});

メリット:

  • 取得する列を明示的に指定できる
  • シンプルで分かりやすい

デメリット:

  • 列が増えた場合、すべてのselectを修正する必要がある
  • 複数箇所で同じ定義を繰り返す

方法3: Zodでバリデーション(推奨)

import { z } from 'zod';

// スキーマ定義
const UserSchema = z.array(
  z.object({
    id: z.number(),
    name: z.string(),
  })
);

// データ取得とバリデーション
const users = UserSchema.parse(await prisma.user.findMany());

メリット:

  • スキーマで取得データの型を定義・検証できる
  • 型を再利用できる
// 型の再利用
type User = z.infer<typeof UserSchema>[number];

デメリット:

  • Zodのスキーマ定義が必要
  • ���ンタイムでのバリデーションコストが発生

推奨アプローチ

開発初期・小規模プロジェクト

selectを使った明示的な指定で十分です。

中規模以上・型安全性重視

Zodを使ったスキーマ定義を推奨します。以下の利点があります。

  • 型の一元管理
  • ランタイムバリデーション
  • APIレスポンスの型安全性

まとめ

Prismaで不要な列を除外することで、以下のリスクを軽減できます。

  • 機密情報の意図しない露出
  • 不要なデータ転送によるパフォーマンス低下

プロジェクトの規模や要件に応じて、適切な方法を選択しましょう。

Discussion