🍆

Supabase + Prismaで uuid を有効にして動くようにする

2022/04/22に公開

Prisma初心者です。

UUIDをDB側で自動生成してもらうためには、少し作業が必要ですので日本語で情報を残しておきます。

公式ドキュメントは下記をご覧ください。
https://supabase.com/docs/guides/database/extensions/uuid-ossp

注意

SupabaseのサインアップのタイミングでユーザーIDを簡単に紐づけできるようなtirgger機能を使うために、外部キーを authのusers.idと関連付けさせたかったのですが、Prismaではどうやら無理っぽい匂いがしています。SupabaseにおいてはPrismaの使用は適していない部分があるかもしれませんね。

公式ドキュメントではPrismaの紹介がありますが、SupabaseとPrismaの相性最悪説あるんじゃないかと思います。(よーわからん)

auth.usersをpublic.usersとしてコピーすれば通るようですが(下記リンク参照)、Supabase側がセキュアな構成で作ってくれている中で、無理矢理に回避してリスクを負う必要は無いように感じます。

トリガー機能を使わないのであればどうにかなると思います。

https://github.com/prisma/prisma/issues/1175

https://github.com/supabase/supabase/issues/1502

※この画面で設定するやつ


準備

SupabaseのGUIから「Database」->「Extensions」の画面から「UUID-OSSP」が有効になっていることを確認します。

schema.prisma
model Hoge {
  id    String  @id @default(dbgenerated("uuid_generate_v4()"))
  title String  @db.VarChar(255)
}

モデルの準備ができたらDBに反映させます。

npx prisma db push

これで自動的にuuidが挿入されるようになります。

上記のテーブルであれば、titleの値だけ投げればuuidはDB側で用意してくれます。

確認する

一応、SupabaseのGUIでカラムの情報を見ておいた方が安心感あるかと思います。

Default Valueの値に uuid_generate_v4() が入っていれば成功です。Insert rowから適当に値を登録してみて、uuidが生成されることを確認しておきましょう。

dbgenerated("uuid_generate_v4()") によって、uuid_generate_v4() がDB側で走るように設定する記述です。@default("uuid_generate_v4()") だけだと uuid_generate_v4() というテキストデータが入るだけなので注意してください。


抑えておきたいこと

UUIDのメリットは、アプリケーション側で採番ができること。アプリケーション側で生成した方が余計なリクエストを削減できて何かと便利なシーンがあるんだとか。IDが必要ないシーンを除いて、SPAなサイトを制作するのであれば、基本的にアプリケーション側で生成する方針の方が良さそうかも?

◆uuid
https://www.npmjs.com/package/uuid

◆@types/uuid
https://www.npmjs.com/package/@types/uuid

Discussion