2023-01-18に更新

PrismaでPlanetScaleを使う時のエラーあれこれ

PrismaをPlanetScaleで実際に利用している時にいくつかエラーが発生したのでその対処など。

routines:tls_process_server_certificate:certificate verify failed

こんなエラーがでて接続できない時。

そもそもPlanetScaleにかかれている接続方法のDATABASE_URLの末尾にはSSL接続のために ?sslaccept=strict というものがついている。コンテナ稼働でデプロイされていると証明書周りの問題でこのあたりがだめっぽいとのこと。

なので解決方法としては sslaccept=accept_invalid_certs にすれば良いとのこと。(本当にそれでいいかは不明)

参考)
https://github.com/prisma/prisma/issues/884

Invalid prisma.modelname.update() invocation

modelname というところには自分で作ったモデル名が入る。正確には下記のようなメッセージ。

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開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント