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とどの辺が違うの?
大きく違う点としては以下の内容を挙げることができます。
- DBがNoSQLじゃなくて、Postgres
- Hostingはない
- serverless functionのランタイムがDeno
個人的にはPosgresなのが良い印象です(無料でリレーショナルデータベースが使えるサービスってなかなかないので…)。 Hostingについては、強力なhosting serviceが他にもたくさんあるのでなくても困らないかなと思っています。 Denoである点について、私はsupabaseを触るまでDenoを触ったことがなかったのですが、書き心地としては基本Nodeと同じであまり違和感はありませんでした。DenoとNodeの違いなどについてはこの記事の範囲を超えるので割愛します。
お値段感
詳細はこちらをご参照。フリープランだとDBが500MB、Storageが1GB、functionが500,000呼び出しまでとなっています。小規模なサービスだと余裕、広く使ってもらうとなるとProプランの検討が必要になりそうですね。
どの辺がいいの?
現状使っている感覚としてFirebaseより良いなと思っている点としては以下の内容を挙げることができます。
- CLIコマンドの機能が充実している
- DBのスキーマから自動でREST/GraphQLのAPIを生成してくれる
1. CLIコマンドの機能が充実している
環境構築
supabase init
でローカル用の設定ファイル等々を配置してくれます。
生成されたディレクトリ・ファイルは以下のようになります。
seed.sql
はローカルのDBに対して起動時にやりたい処理をかけます(テストデータを入れるなど)。
functions
はserverless functionのコードなどが入ります。
supabase start
でDockerを利用したsupabase環境を構築してくれます。
※めっちゃDockerのイメージをpullするので注意
pullして諸々起動し終わるとコンソール上に一通り接続情報が表示されます。
例えばStudio URLをブラウザで表示すると、supabaseのdashboardが表示されます。
serverless function
supabase functions new [function-name]
で関数を生成できます。
生成されたhello-world/index.tsはこんな感じです。呼び出し方も書いてますね。
実際に呼び出すとこんな感じです。
ログを流したいときはsupabase functions serve
でserveします。
デプロイはsupabase functions deploy [function-name]
です。
DB
ローカルのスキーマ変更を吐き出してリモートにプッシュする
例えば、ローカルのStudioからuserテーブルを作りました。
supabase db diff -f [filename-suffix]
でスキーマの差分を吐き出すことができます。
リモートにこのスキーマをプッシュしたいときはsupabase login
とsupabase link
コマンドで特定のprojectとlinkしたうえで、以下のコマンドを叩きます。
supabase db push
でリモートにプッシュします。
suapbase db remote commit
でリモート側のスキーマ差分をsqlに吐き出すこともできます。
TypeScriptの型定義ファイル
supabase gen types typescript
でDBのスキーマからTypeScriptの型定義ファイルを生成できます。
生成したファイルはこんな感じです。
これはsupabaseのsdkに噛ませることもできるため、型安全に開発を進めることができます。
DBのスキーマを云々、型定義を云々についてはFirebaseではできないので(そもそもNoSQLでスキーマレスだし…)、個人的にかなり強力な強みかなと思っています。
2.DBのスキーマから自動でREST/GraphQLのAPIを生成してくれる
DBのスキーマに従って自動でREST/GraphQLのAPIを生成してくれます(PostgRESTを使っているらしい)。GUI上で呼び出し方のドキュメントを確認することができます。
Tips
sdk経由で複雑なクエリを呼び出したい場合
外部キーなどを貼っている場合はsdkでもよしなに結合してくれるのですが、そうでない副問い合わせを含むクエリなどはsdkでは表現できない場合があります。この場合はsqlをviewとしてDB側に定義しておいて、それをsdkで呼び出すようにしています。(viewの型定義はsupabase gen
で生成できるため)