Supabase – мощная и набирающая популярность система. Это бесплатная и простая альтернатива Firebase. Даже если вы не знакомы с Firebase. В Supabase есть все, что вам нужно. База данных с подписками в реальном времени, аутентификацией и хранением.
Привет, я создал Happy React. Сервис для бесплатного добавления виджетов реакций на ваш сайт. Я позаботился о производительности и простоте использования. Вы можете добавлять реакции в свой блог или на страницы документации! Он все еще находится в раннем доступе, дайте мне знать, что вы думаете об этом и присоединяйтесь к списку ожидания. Узнайте больше на https://happyreact.com/.
О Supabase
Supabase построена на базе технологий с открытым исходным кодом. PostgreSQL, PostgREST, gotrue и многие-многие другие. Это отличная идея. Существует множество отличных библиотек и технологий. Умное использование устоявшихся инструментов может быть лучше, чем тратить время на изобретение колеса.
В бесплатном плане есть все функции, необходимые для создания приложения. Самое приятное, что вы не привязаны к нему. Вы можете сбросить данные своей базы данных и перенести их к другому провайдеру или на собственный сервер. Нет никакой привязки!
В дополнение ко всем этим функциям есть приборная панель, которая позволяет управлять проектом.
Возможности Supabase
- Auth
- Хранение
- База данных с подписками в реальном времени
Supabase не совершенен, но он мощный.
То, что является самой большой силой, является и самым большим недостатком. Я повторяюсь, но Supabase построен поверх PostgreSQL. Вам нужно знать SQL, как создавать запросы и какими возможностями обладает PostgreSQL. Ниже приведены распространенные проблемы с Supabase, с которыми вы можете столкнуться после начала работы.
Создание представления для сложных запросов
Конструктор запросов Supabase является гибким. Он может выполнять базовые запросы select, count rows или join, но иногда требуется более продвинутое использование SQL. Представления Postgres могут помочь вам в этом.
drop view if exists sold_products;
create
or replace VIEW public.sold_products AS (
select
DISTINCT ON (orders.product_id) product_id,
products.name as name
from
orders
inner join products on orders.product_id = products.id
);
Этот небольшой фрагмент получает все заказы и исключает повторяющиеся товары, таким образом, мы получаем список всех проданных товаров.
⚠️ Обратите внимание, что представление наследует права создателя. Когда вы создаете его как администратор, оно будет иметь те же права (в обход RLS), что и администратор. Создавайте представления с осторожностью.
Добавление каскадирования при удалении
При удалении одной записи из таблицы, которая имеет столбец внешнего ключа в другой таблице, вы получите ошибку. Чтобы удалить запись и другие записи с внешними ключами, необходимо добавить каскадное удаление.
CREATE OR REPLACE FUNCTION
replace_foreign_key(f_table VARCHAR, f_column VARCHAR, new_options VARCHAR)
RETURNS VARCHAR
AS $$
DECLARE constraint_name varchar;
DECLARE reftable varchar;
DECLARE refcolumn varchar;
BEGIN
SELECT tc.constraint_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY'
AND tc.table_name= f_table AND kcu.column_name= f_column
INTO constraint_name, reftable, refcolumn;
EXECUTE 'alter table ' || f_table || ' drop constraint ' || constraint_name ||
', ADD CONSTRAINT ' || constraint_name || ' FOREIGN KEY (' || f_column || ') ' ||
' REFERENCES ' || reftable || '(' || refcolumn || ') ' || new_options || ';';
RETURN 'Constraint replaced: ' || constraint_name || ' (' || f_table || '.' || f_column ||
' -> ' || reftable || '.' || refcolumn || '); New options: ' || new_options;
END;
$$ LANGUAGE plpgsql
Затем вам нужно вызвать функцию, подобную этой:
select replace_foreign_key('user_rates_posts', 'post_id', 'ON DELETE CASCADE');
Безопасность на уровне строк
Защитить вашу базу данных от несанкционированного доступа можно с помощью RLS. Эти специальные “проверки” выполняются перед запросом, чтобы убедиться, что у того, кто его выполняет, есть на это права.
Вы можете сослаться на uid()
, который будет заменен на идентификатор пользователя, который в данный момент авторизован. Вы можете сравнить, принадлежит ли обрабатываемая в данный момент запись авторизованному пользователю.
Все значения, которые вы отправляете с помощью Supbase SDK, будут заменены внутри политики RLS.
Далее вам нужно добавить RLS. Хорошей идеей является сохранение чистоты и создание функции Postgres, в которую вы можете передать все переменные и сделать запрос:
CREATE
OR REPLACE FUNCTION can_insert_post(_user_id uuid) RETURNS bool AS $$
SELECT EXISTS (
SELECT
1
FROM
posts
INNER JOIN users ON users.id = posts.user_id
GROUP BY
users.id,
posts.user_id
HAVING
COUNT(posts.id) < users.post_limit
AND _user_id = posts.user_id
);
$$ LANGUAGE sql SECURITY DEFINER;
Эта функция будет проверять, не превысил ли пользователь лимит сообщений. Далее вам нужно сослаться на нее в политике вставки RLS.
can_insert_post(uid())
Сводка
Supabase – отличный инструмент, но он требует некоторых знаний Postgres. Помните, что это только вершина айсберга. Чем больше вы будете погружаться в Supabase, тем больше знаний Postgres вам понадобится.