supabaseって何?

公式ページから。

Supabase is an open source Firebase alternative for building secure and performant Postgres backends with minimal configuration.

Firebaseの代替Open Sourceで、Postgresを使ってます、という感じですね。 githubのREADME上のstatusはPublic Betaまでチェックが入っていて、商用利用以外は十分耐えるよという形になっています。

Firebaseとどの辺が違うの?

大きく違う点としては以下の内容を挙げることができます。

  1. DBがNoSQLじゃなくて、Postgres
  2. Hostingはない
  3. serverless functionのランタイムがDeno

個人的にはPosgresなのが良い印象です(無料でリレーショナルデータベースが使えるサービスってなかなかないので…)。 Hostingについては、強力なhosting serviceが他にもたくさんあるのでなくても困らないかなと思っています。 Denoである点について、私はsupabaseを触るまでDenoを触ったことがなかったのですが、書き心地としては基本Nodeと同じであまり違和感はありませんでした。DenoとNodeの違いなどについてはこの記事の範囲を超えるので割愛します。

お値段感

詳細はこちらをご参照。フリープランだとDBが500MB、Storageが1GB、functionが500,000呼び出しまでとなっています。小規模なサービスだと余裕、広く使ってもらうとなるとProプランの検討が必要になりそうですね。

どの辺がいいの?

現状使っている感覚としてFirebaseより良いなと思っている点としては以下の内容を挙げることができます。

  1. CLIコマンドの機能が充実している
  2. DBのスキーマから自動でREST/GraphQLのAPIを生成してくれる

1. CLIコマンドの機能が充実している

環境構築

supabase initでローカル用の設定ファイル等々を配置してくれます。 image.png

生成されたディレクトリ・ファイルは以下のようになります。 image.png

seed.sqlはローカルのDBに対して起動時にやりたい処理をかけます(テストデータを入れるなど)。 functionsはserverless functionのコードなどが入ります。

supabase startでDockerを利用したsupabase環境を構築してくれます。 ※めっちゃDockerのイメージをpullするので注意 pullして諸々起動し終わるとコンソール上に一通り接続情報が表示されます。 image.png

例えばStudio URLをブラウザで表示すると、supabaseのdashboardが表示されます。 image.png

serverless function

supabase functions new [function-name]で関数を生成できます。

image.png

生成されたhello-world/index.tsはこんな感じです。呼び出し方も書いてますね。 image.png

実際に呼び出すとこんな感じです。 image.png

ログを流したいときはsupabase functions serveでserveします。 image.png

デプロイはsupabase functions deploy [function-name]です。

DB

ローカルのスキーマ変更を吐き出してリモートにプッシュする

例えば、ローカルのStudioからuserテーブルを作りました。 image.png

supabase db diff -f [filename-suffix]でスキーマの差分を吐き出すことができます。 image.png

リモートにこのスキーマをプッシュしたいときはsupabase loginsupabase linkコマンドで特定のprojectとlinkしたうえで、以下のコマンドを叩きます。

supabase db pushでリモートにプッシュします。 image.png

suapbase db remote commitでリモート側のスキーマ差分をsqlに吐き出すこともできます。

TypeScriptの型定義ファイル

supabase gen types typescriptでDBのスキーマからTypeScriptの型定義ファイルを生成できます。 image.png

生成したファイルはこんな感じです。 image.png

これはsupabaseのsdkに噛ませることもできるため、型安全に開発を進めることができます。

DBのスキーマを云々、型定義を云々についてはFirebaseではできないので(そもそもNoSQLでスキーマレスだし…)、個人的にかなり強力な強みかなと思っています。

2.DBのスキーマから自動でREST/GraphQLのAPIを生成してくれる

DBのスキーマに従って自動でREST/GraphQLのAPIを生成してくれます(PostgRESTを使っているらしい)。GUI上で呼び出し方のドキュメントを確認することができます。

image.png

Tips

sdk経由で複雑なクエリを呼び出したい場合

外部キーなどを貼っている場合はsdkでもよしなに結合してくれるのですが、そうでない副問い合わせを含むクエリなどはsdkでは表現できない場合があります。この場合はsqlをviewとしてDB側に定義しておいて、それをsdkで呼び出すようにしています。(viewの型定義はsupabase genで生成できるため)

記事一覧に戻る