📺

【Flutter x Supabase】クライアントアプリから新しく追加したスキーマに繋がらない場合の解決策一例

2025/02/11に公開

はじめに

Supabase, PostgreSQLの関係の備忘録です。

前提

  • Supabase Auth関連の設定完了済み
  • クライアントアプリから認証成功済み
  • Supabase管理画面の新規プロジェクト、DB作成済み
  • Supabase上でカスタムスキーマを追加してそこにテーブル追加、RLS等設定済み

環境

  • Flutter version 3.27.1
  • Dart version 3.6.0
  • DevTools version 2.40.2
  • supabase_auth_ui: ^0.5.4
  • supabase_flutter: ^2.8.3

クライアントリクエスト

事前にSupabase上でuser_dataスキーマを登録、
そこにUserのプロフィール管理用のProfilesテーブルを追加してあります。

  /// ユーザーを取得する
  /// [userId] ユーザーID
  
  FutureResult<model.User?> fetchUser(String userId) async {
    try {
      final response = await _client
          .schema('user_data')
          .from('profiles')
          .select()
          .eq('user_id', userId)
          .single();

      return Success(model.User.fromJson(response));
    } on Exception catch (e, s) {
      logger.warning(e.toString());
      return Failure(Exception(e.toString()), s);
    }
  }

Supabase.instance.clientのデフォルトスキーマはpublicになっていますが、
初期化時にデフォルトの変更も可能です。

  await Supabase.initialize(
    url: Env.supabaseUrl,
    anonKey: Env.supabaseAnonKey,
    postgrestOptions: const PostgrestClientOptions(schema: 'user_data'),
  );

エラー

PostgrestException(message: The schema must be one of the following: public, graphql_public, code: PGRST106, details: Not Acceptable, hint: null)

参考issue

https://github.com/supabase/supabase-py/issues/518

解決方法

Supabase管理画面 → プロジェクト設定 → Data API Settings にあるExposed schemas
に新しいスキーマを追加する必要があります。

再度実行

PostgrestException(message: JSON object requested, multiple (or no) rows returned, code: PGRST116, details: The result contains 0 rows, hint: null)

まだデータを入れてないのでエラーになっていますが、これでスキーマは公開されるようにできました。

一件落着

というわけで、これで次へ進められそうです。

Discussion