📺
【Flutter x Supabase】クライアントアプリから新しく追加したスキーマに繋がらない場合の解決策一例
はじめに
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
解決方法
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