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

- Пройдена настройка 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;
$$;
Чтобы создать функцию:
- Откройте проект в панели Supabase.
- Перейдите в SQL Editor и вставьте SQL-запрос.
- Нажмите Run и проверьте, что вернулись ожидаемые строки.
- Откройте Database > Functions и убедитесь, что функция появилась в списке.
Оставляйте security invoker, если функции не нужны именно права её создателя. С invoker функция выполняется от имени того пользователя, который вошёл в приложение. Заодно проверьте, кому разрешено вызывать функцию, и закройте таблицы, которые она читает, политиками RLS. Подробности — в руководстве по функциям и руководстве по защите API Supabase.
2. Импортируйте функции во FlutterFlow
После того как функция создана или изменена в Supabase, обновите схему во FlutterFlow:
- Откройте Settings and Integrations > Supabase.
- Убедитесь, что подключён нужный проект Supabase.
- Нажмите Update Schema.
FlutterFlow заново прочитает описание базы, и подходящие функции PostgreSQL появятся в списке действий Supabase RPC. Повторяйте этот шаг каждый раз, когда меняете у функции имя, аргументы или тип результата.

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

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 |
|---|---|---|
id | id | String |
project_name | project_name | String |
number_tasks | number_tasks | Integer |
completed_tasks | completed_tasks | Integer |
completion_percentage | completion_percentage | Double |
Функция возвращает несколько строк, поэтому создайте переменную состояния страницы со списком значений ProjectProgress. В действии Update Page State возьмите за источник Action Output вызова RPC и сопоставьте JSON-массив с этой переменной. Дальше список можно использовать в виджетах и в следующих действиях на странице.
Сохранять результат в состояние страницы не обязательно, если он нужен только последующим действиям в той же цепочке. Тогда берите результат RPC прямо из Action Outputs.
Частые вопросы
Функция не появляется во FlutterFlow. Почему?
Проверьте, что функция существует в подключённом проекте Supabase, и нажмите Update Schema. Если её всё равно нет в списке, посмотрите на схему функции, её аргументы и тип результата — не все сочетания FlutterFlow умеет импортировать.
При вызове функции приложение получает ошибку доступа. Что проверить?
Права на выполнение функции и права на каждую таблицу, которую она читает. Для функции с security invoker доступ к данным нужен самому вызывающему пользователю — с учётом политик RLS.
В действии старые аргументы или поля результата. Как обновить?
После правки функции нажмите Update Schema. Затем заново откройте действие Supabase RPC и проверьте аргументы, выходную переменную и все виджеты и переменные состояния, которые используют результат.