概要
現在私は、NestJS + GraphQL + prisma という構成でアプリケーションを作成している。
このアプリケーションで、prismaで参照しているDBにカラムとしては存在するけど、今回のアプリケーションでは使わないカラムだから無視したいという欲が出てきた。
https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#ignore のドキュメントを見るに、 @ignore
をつけるとPrismaClientから見れなくなるよ的なことが書いてある(気がする)ので、以下のようにスキーマに @ignore
を追加した。
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(カラム)の更新があったらエラーになるのかもしれない※挙動未確認
まとめ
ちゃんとドキュメントを読もう!