🔼
Prismaのデータ取得で不要な列を除く
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();
この場合、id
、name
、email
の3つの列が取得されます。例えばemail
列は不要であり、思わぬ情報漏洩のリスクがあります。
selectを使用
select
を使って、取得する列を指定します。
const users = await prisma.user.findMany({
select: {
id: true,
name: true,
},
});
この場合、id
、name
の2つの列だけが取得されます。
メリットは、取得する列を明示的に指定できることです。
デメリットは、列が増えた場合、select
を修正する必要があることです。
zodを使用
zod
のparse
を使って、取得する列を指定します。
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