🔼

Prismaのデータ取得で不要な列を除く

2024/05/18に公開

Prismaでデータを取得する際に、不要な列が含まれてしまう場合があります。セキュリティ上、意図しない列が含まれるのは避けたいところです。

Prismaのデータ取得で不要な列を除く方法を紹介します。

検証バージョンは prisma 5.14.0 です。

使用するスキーマ

Userテーブルを例に説明します。

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

データ取得

javascriptでデータ取得します。

対策なし

PrismaではfindManyメソッドを使ってデータを取得します。

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

この場合、idnameemailの3つの列が取得されます。例えばemail列は不要であり、思わぬ情報漏洩のリスクがあります。

selectを使用

selectを使って、取得する列を指定します。

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

この場合、idnameの2つの列だけが取得されます。

メリットは、取得する列を明示的に指定できることです。
デメリットは、列が増えた場合、selectを修正する必要があることです。

zodを使用

zodparseを使って、取得する列を指定します。

import { z } from 'zod';

const User = z.array(
  z.object({
    id: z.number(),
    name: z.string(),
  })
);

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

メリットは、取得する列をスキーマで定義できることです。型としても再利用できるので、コードの保守性が向上します。

const User = z.array(
  z.object({
    id: z.number(),
    name: z.string(),
  })
);
// User型を取得
type User = z.infer<typeof User>; 

デメリットは、zodのスキーマを定義する必要があることです。

さいごに

Prismaで不要な列を除く方法を紹介しました。

不要な列を取得することで、セキュリティリスクが高まります。
適切な対策で情報漏洩を防ぎましょう。

Discussion