Функции базы Supabase

Функции базы данных Supabase — это обычные функции PostgreSQL, которые живут и выполняются внутри вашей базы. FlutterFlow вызывает их через RPC (Remote Procedure Call): передаёт аргументы и получает результат, с которым дальше можно работать в приложении.

Такие функции выручают там, где обычного запроса к таблице не хватает: расчёты, агрегаты, сложные выборки из нескольких таблиц. Например, приложение ниже считает и показывает процент выполненных задач по каждому проекту — эту цифру ему отдаёт функция базы.

Приложение показывает процент выполнения задач, который вернула функция базы Supabase

инфо
Что нужно заранее
  • Пройдена настройка Supabase, проект подключён к FlutterFlow.
  • Для примера из этой статьи — таблица tasks с колонками, которые читает функция.
  • Настроены права доступа и политики Row Level Security (RLS) для данных, к которым обращается функция.

Когда нужна функция базы

Функция базы уместна, когда нужно:

  • вернуть результат сложного запроса или собрать данные из нескольких связанных таблиц;
  • посчитать что-то или агрегировать данные там же, где они лежат, а не тащить всё в приложение;
  • использовать одну и ту же логику в разных местах приложения;
  • выполнить несколько связанных операций с базой одним вызовом.

Для простых операций со строками — добавить, изменить, удалить, выбрать — достаточно действий с базой Supabase. А если нужен серверный TypeScript, секреты или обращения к внешним сервисам, берите Supabase Edge Function.

1. Создайте функцию в Supabase

Функцию создают в панели Supabase через SQL Editor — так, как описано в руководстве Supabase.

Функция get_project_progress ниже читает счётчики задач по каждому проекту и возвращает процент выполнения:

create or replace function public.get_project_progress()
returns table (
  id text,
  project_name text,
  number_tasks bigint,
  completed_tasks bigint,
  completion_percentage numeric
)
language sql
security invoker
as $$
  select
    t.id,
    t.project_name,
    t.number_tasks,
    t.completed_tasks,
    case
      when coalesce(t.number_tasks, 0) = 0 then 0
      else round(
        (coalesce(t.completed_tasks, 0)::numeric / t.number_tasks) * 100,
        2
      )
    end as completion_percentage
  from public.tasks t;
$$;

Чтобы создать функцию:

  1. Откройте проект в панели Supabase.
  2. Перейдите в SQL Editor и вставьте SQL-запрос.
  3. Нажмите Run и проверьте, что вернулись ожидаемые строки.
  4. Откройте Database > Functions и убедитесь, что функция появилась в списке.

совет
Безопасность функции

Оставляйте security invoker, если функции не нужны именно права её создателя. С invoker функция выполняется от имени того пользователя, который вошёл в приложение. Заодно проверьте, кому разрешено вызывать функцию, и закройте таблицы, которые она читает, политиками RLS. Подробности — в руководстве по функциям и руководстве по защите API Supabase.

2. Импортируйте функции во FlutterFlow

После того как функция создана или изменена в Supabase, обновите схему во FlutterFlow:

  1. Откройте Settings and Integrations > Supabase.
  2. Убедитесь, что подключён нужный проект Supabase.
  3. Нажмите Update Schema.

FlutterFlow заново прочитает описание базы, и подходящие функции PostgreSQL появятся в списке действий Supabase RPC. Повторяйте этот шаг каждый раз, когда меняете у функции имя, аргументы или тип результата.

Кнопка Update Schema в настройках Supabase во FlutterFlow

3. Вызовите функцию

Импортированную функцию можно вызвать из любого подходящего триггера. Например, при загрузке страницы — чтобы показать свежий прогресс сразу при открытии.

  1. Выберите виджет или страницу, откуда будет вызов, и откройте Action Flow Editor.
  2. Выберите существующий триггер или добавьте новый.
  3. Добавьте действие Supabase RPC.
  4. Если у функции есть аргументы, задайте каждый — конкретным значением или переменной.
  5. Укажите Action Output Variable Name, чтобы обращаться к результату в следующих действиях.

Вызов функции базы Supabase из Action Flow Editor

4. Используйте результат

Что окажется в выходной переменной, определяет объявленный тип результата функции. Функция может вернуть одно значение, один объект или набор строк. Скажем, get_project_progress объявлена как returns table (...) — табличный результат с колонками для названия проекта, счётчиков задач и вычисленного процента:

returns table (
  id text,
  project_name text,
  number_tasks bigint,
  completed_tasks bigint,
  completion_percentage numeric
)

returns table только описывает колонки ответа — никакой физической таблицы в Supabase при этом не создаётся. Строки приходят в приложение JSON-массивом, где каждая строка — объект:

[
  {
    "id": "c45a5311-3899-437b-9be5-72b4b342751a",
    "project_name": "Mobile App Release - Discovery",
    "number_tasks": 13,
    "completed_tasks": 5,
    "completion_percentage": 38.46
  }
]

Чтобы работать с этими строками как со структурой, заведите собственный тип данных — например, ProjectProgress. Имена его полей должны совпадать с ключами JSON буква в букву, включая регистр и подчёркивания:

Поле в JSONПоле типа данныхТип во FlutterFlow
ididString
project_nameproject_nameString
number_tasksnumber_tasksInteger
completed_taskscompleted_tasksInteger
completion_percentagecompletion_percentageDouble

Функция возвращает несколько строк, поэтому создайте переменную состояния страницы со списком значений ProjectProgress. В действии Update Page State возьмите за источник Action Output вызова RPC и сопоставьте JSON-массив с этой переменной. Дальше список можно использовать в виджетах и в следующих действиях на странице.

заметка

Сохранять результат в состояние страницы не обязательно, если он нужен только последующим действиям в той же цепочке. Тогда берите результат RPC прямо из Action Outputs.

Частые вопросы

Функция не появляется во FlutterFlow. Почему?

Проверьте, что функция существует в подключённом проекте Supabase, и нажмите Update Schema. Если её всё равно нет в списке, посмотрите на схему функции, её аргументы и тип результата — не все сочетания FlutterFlow умеет импортировать.

При вызове функции приложение получает ошибку доступа. Что проверить?

Права на выполнение функции и права на каждую таблицу, которую она читает. Для функции с security invoker доступ к данным нужен самому вызывающему пользователю — с учётом политик RLS.

В действии старые аргументы или поля результата. Как обновить?

После правки функции нажмите Update Schema. Затем заново откройте действие Supabase RPC и проверьте аргументы, выходную переменную и все виджеты и переменные состояния, которые используют результат.

перевод официальной документации FlutterFlow

обновлено

ESC