2
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?

More than 1 year has passed since last update.

prismaのスキーマで安易に@ignoreを使って詰まった

Last updated at Posted at 2022-05-27

概要

現在私は、NestJS + GraphQL + prisma という構成でアプリケーションを作成している。
このアプリケーションで、prismaで参照しているDBにカラムとしては存在するけど、今回のアプリケーションでは使わないカラムだから無視したいという欲が出てきた。
https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#ignore のドキュメントを見るに、 @ignore をつけるとPrismaClientから見れなくなるよ的なことが書いてある(気がする)ので、以下のようにスキーマに @ignore を追加した。

schema.prisma
model Sample {
  id   Int    @id @default(autoincrement())
  name String @db.VarChar(255)
  test String @ignore

  @@map("samples")
}

スキーマ修正後にSampleのレコードを作りたいなあとなったので、NestJS内で await this.prisma.sample.create(input) としようとした場合に問題は起こった。

起こった問題

Property 'create' does not exist on type 'SampleDelegate<RejectOnNotFound | RejectPerOperation>'

まあ要するに sampleに create() なんていう関数はないと言われた。
ちなみに、update() はあって、 create() だけない状況になった。
なんなら既に他のテーブルにレコードを追加する処理は書いてあったし、なぜSampleにだけcreateがないの???って状態だった。

解決法

https://github.com/prisma/prisma/issues/13467 に原因が載っていて、必須のfieldに @ignore をつけると create/update が使えなくなるということだった。
まあ、DB上では必須の項目がPrismaからは参照できない(入力しても無視される)=nullになる可能性が出てくるということを考えれば当たり前っちゃ当たり前かもしれない。(DBの設定でデフォルト値が設定されているならば問題ないだろうが、デフォルト値が設定されているかいちいち確認して挙動を変えるとかそりゃprisma側としてはやりたくないだろうし、createできなくするのも納得という感じ)
issueの回答として ? をつけてoptionalにすればええよ的なことが書いてあるが、今回はそもそもスキーマからfieldごと消すことで対応した。
updateができることは謎だが、updateは基本的にどの属性もoptionalなので、 @ignore がついているfield(カラム)の更新があったらエラーになるのかもしれない※挙動未確認

まとめ

ちゃんとドキュメントを読もう!

2
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
2
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?