PrismaをPlanetScaleで実際に利用している時にいくつかエラーが発生したのでその対処など。
こんなエラーがでて接続できない時。
そもそもPlanetScaleにかかれている接続方法のDATABASE_URLの末尾にはSSL接続のために ?sslaccept=strict
というものがついている。コンテナ稼働でデプロイされていると証明書周りの問題でこのあたりがだめっぽいとのこと。
なので解決方法としては sslaccept=accept_invalid_certs
にすれば良いとのこと。(本当にそれでいいかは不明)
参考)
https://github.com/prisma/prisma/issues/884
prisma.modelname.update()
invocationmodelname
というところには自分で作ったモデル名が入る。正確には下記のようなメッセージ。
Invalid `prisma.user.update()` invocation:
The column `app.User.id` does not exist in the current database.
参考となるのはこちらのissue。なんか色々詳しく書かれているのでざっと全体的に一読しておいた方が良さそう。
https://github.com/prisma/prisma/issues/7292
これは何かというと、そもそも foreign key constraints are not allowed
というエラーが出ていた。なんとPlanetScaleでは外部キーを使えないらしい。そのため下記のような設定にする必要がある。
Prismaの方から情報を頂いたので下記が新しい情報。Prisma4.5以降、もしくは4.7以降。試してはない。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma"
}
これは古いバージョン(恐らくPrisma4.5より前)のもの。referentialIntegrityはrelationModeに代わったらしい。また、relationModeはpreviewFeaturesに関係なく使えるとのこと。
generator client {
provider = "prisma-client-js"
previewFeatures = ["referentialIntegrity"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
referentialIntegrity = "prisma"
}
この2行追加している referentialIntegrity
というのは何かというと、Prisma側が外部キーの動きと同じようなことをやってくれるような設定っぽい(多分)。これでリレーションなども問題なくデプロイできるのだが、その代償としてこのupdate時のエラーが出てしまうっぽい。不具合なのか仕様なのかは謎。
ということでこれの対処として、onUpdateにNoActionを設定する必要があるらしい。
user User @relation(fields: [userId], references: [id], onUpdate: NoAction)
とりあえずこれで動きはした。(外部キー的にどうなのかは未検証。あとDeleteの場合も未検証)
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント