Masayan tech blog.

  1. ブログ記事一覧>
  2. 今話題のBaaS「supabase」をReactで試す

今話題のBaaS「supabase」をReactで試す

公開日
最終更新日

supabaseとは

supabase(スーパベース)はめちゃくちゃざっくりというと、firebaseのRDB版です。

Firebaseはとても魅了的なサービスですが、NoSQLということもあり用途が制限されますが、
supabaseはRDBのPostgreSQLが使えるので、この時点でテンションが上がりますよね。

supabaseの初期設定

アカウント登録

githubアカウントがあれば、すぐに利用開始できます。

プロジェクトの作成

New projectを押して、新規プロジェクトを作成します。

プロジェクト名、データベースパスワード、リージョンを設定します。

テーブルの作成

データベースとAPIが作成され、createa new tableからテーブルを作成します。

テーブル名などの情報を登録し、Save

テーブルが作成できました。

カラムの追加

primary keyしかないので、New columnからカラムを追加します
nameとemailを追加しました。

デモデータを追加する

Insert rowからレコードを追加できます

idはオートインクリメントなので、それ以外を入力します。

追加できました。(認証は不要なので、パスワードとemailはいらないのですが、適当に作っておきました)

リレーション(foreign keyの設定)

今回はリレーションのやり方も見ておきたいので、もう一つ、recipesテーブルを追加します。

users.idをrecipesテーブルに外部キーとして貼りたいので、New columnを押し、user_idカラムを追加します。

追加する際、Add foreign key relationを押します。

リレーションの対象テーブルとカラムを登録します。

これだけでリレーションの設定ができちゃいました。

recipesテーブルに3つレコードを追加しました。

Reactアプリから接続する

Reactアプリのセットアップ

create-react-app

create-react-appでreactアプリを作成する。
※create-react-appの詳細は割愛します。

Reactアプリにsupabaseの設定を追加

手順は、API / Introduction に丁寧に書いてくれています。

supabaseのインストール

npm install --save @supabase/supabase-js

supabase用設定ファイル

src/config.js

import { createClient } from "@supabase/supabase-js";

const supabaseUrl = "YOUR URL";
const supabaseKey = "YOUR APIKEY"
  
export const config = {
  supabase: createClient(supabaseUrl, supabaseKey),
};

URLとsupabasekeyは以下から確認できます。

Setting / API

親コンポーネント(データ取得用)

データベースからユーザーIDが1のデータをフェッチして、stateに格納し、子コンポーネントに渡す

src/App.js

import { useEffect, useState } from "react";
import Recipe from "./Recipe";

// supabaseの設定ファイルをインポート
import { config } from "./config";

const App = () => {
  const [recipeList, setRecipeList] = useState([]);
  const supabase = config.supabase;

  // 実際はfirebase authとかバックエンドのapiを叩いてユーザーidを取得
  const userId = 1;

  const fetchRecipes = async () => {
    const reicpes = await supabase
      .from("users")
      .select(
        `
    id, name ,email, // usersテーブルで取得したいカラムを指定
    // リレーション先のテーブルを指定
    recipes(
      user_id,recipe_name)
  `
      )
      // 
      .eq("id", userId); // ユーザーIDを指定
   // stateを更新
    setRecipeList(reicpes.data);
  };

  useEffect(() => {
    fetchRecipes();
  }, []);

  return (
    {recipeList.length > 0 ? recipeList.map((data) => ( )) : ""  );
};

export default App;

子コンポーネント(データイテレート用)

propsでデータを受け取ってユーザー名とレシピ一覧を表示

src/Recipe.js

const Recipe = (props) => {
  return (
    <div className="recipe">
    <h4>ユーザー名:{props.username}</h4>
    <h4>レシピ一覧</h4>
    <ul>
      {props.recipeList.map((recipe) => (
        <li key={recipe.id}>{recipe.recipe_name}</li>
      ))}
    </ul>
  </div>
  );
};

export default Recipe;

READ

ブラウザで確認

npm start

しっかりデータを取得できています。

CREATE

insertで追加できます

src/App.js

〜割愛〜

const App = () => {
  〜割愛〜

  const saveRecipe = async () => {
    const newRecipe = await supabase.from("users").insert([
      {
        user_id: userId,
        recipe_name: "味噌汁",
      },
    ]);

    return newRecipe;
  };
 return ( <div className="App"> {recipeList.length > 0 ? recipeList.map((data) => ( <Recipe key={data.id} username={data.name} recipeList={data.recipes} /> )) : "" } <button onClick={() => saveRecipe()}>レシピを追加する</button> </div> );  );
};

export default App;

まとめ

いかがでしたでしょうか。本記事では、今話題のBaaS「supabase」をReactで使用する手順について説明しています。supabase(スーパベース)はめちゃくちゃざっくりというと、firebaseのRDB版です。Firebaseはとても魅了的なサービスですが、NoSQLということもあり用途が制限されますが、supabaseはRDBのPostgreSQLが使えるので、この時点でテンションが上がりますよね。