Сегодня разберем супер интересные инсайты по использованию SQL в Bubble.
Я советую всем начинать изучать и внедрять SQL БД (Supabase) в свои сложные приложения, так как это расширяет потенциальные возможности приложения и улучшает скорость работы в десятки раз.
Лектором является разработчиком стартапа Xolution, который специализируется на создании финансовых отчетов с агрегацией данных и отображением таблиц с десятками тысяч строк.
Сама по себе лекция оказалась не особо информативной, но привела меня на множество идей, которые я проверил и рассказываю вам.
1️⃣ В его приложении используется база Bubble и тарифный план с отдельным сервером - на этом уровне пользователь получает доступ для чтения через SQL своей Bubble БД. Вы можете использовать любую стороннюю SQL БД (MySQL, PostgreSQL)
В его запросах стоит лимит 10000, хотя в стандартных запросах Bubble разрешает выдавать лишь 200 строк максимум. Лучше избегать таких кейсов и использовать пагинацию (OFFSET), но в крайнем случае обходом может являться использование API с запросом к БД, там нет лимитов.
2️⃣ Динамический запрос - лектор показывает запрос с функцией execute_dynamic_query, где переменной является текст самого запроса (Select * FROM…). Он использует этот запрос для того, чтобы динамически выбирать нужную базу (тестовую/лайв), так как невозможно указать название базы через стандартную переменную ($1).
Такой функции в PostgreSQL не существует, поддержка Bubble предоставила ему эту функцию, предварительно создав ее в самой базе Bubble. Однако, я исследовал эту идею и сделал такую функцию сам:
CREATE OR REPLACE FUNCTION execute_dynamic_sql(query text)
RETURNS SETOF RECORD AS $$
BEGIN
RETURN QUERY EXECUTE query;
END;
$$ LANGUAGE plpgsql;Итоговый запрос в Bubble выглядит так -
SELECT * FROM execute_dynamic_sql($1) AS t(name text), где $1= 'SELECT log_note FROM actions'Важно заметить, что output функции (а значит и query($1)) должен быть всегда одинаковым и конкретизированным (нельзя вернуть все поля через *) - я возвращаю name.
3️⃣ В одном из запросов использовалась интересная функция STRING_TO_ARRAY, которая разбивает строку на массив. Я исследовал другие функции в PostgreSQL и там есть много полезных вещей, которые можно использовать для изменения данных на лету при запросе:
Простые функции - CAST() меняет тип данных на нужные, REGEXP_REPLACE() использует регекс для замены текста, CONCAT() соединяет строки.
GENERATE_SERIES() - c помощью этой функции вы можете создать последовательность с нужным шагом (может понадобиться для проектов с расписаниями).
Пример:
SELECT * FROM GENERATE_SERIES(1, 10, 2);AGE() - cчитает интервал времени между текущей датой и указанной. Возвращает тип данных interval - 1 year 2 months 10 days
Пример:
SELECT age(timestamp '1990-05-23');JSONB_SET() - вы можете хранить набор динамических данных в колонке с типом JSON (вместо того, чтобы создавать поля). Этот JSON можно легко обновлять с помощью этой функции
Пример:
SELECT JSONB_SET(profile_data, '{address, city}', '"Los Angeles"')
FROM users WHERE user_id = 1;
-- Result for profile_data: { "name": "John Doe", "address": { "city": "Los Angeles" } }Кроме того, Supabase поддерживает различные extensions. К примеру с помощью plv8 вы можете создать JS функцию прямо в базе и вызывать ее, чтобы изменить данные для запроса или просто получить результат функции на фронт (вместо использования Toolbox). Созданными функциями легко управлять на отдельной странице Database - Functions.
Ставьте лайк и подписывайтесь, на следующей неделе разберем лекцию “Как составлять scope проекта, когда детали неясны”