Supabase Database Operations
Overview
This skill provides tools for working with Supabase database tables through the REST API. Supports SELECT queries with filtering, INSERT, UPDATE, DELETE operations, and calling RPC functions.
Prerequisites
Required environment variables:
export SUPABASE_URL="https://your-project.supabase.co"
export SUPABASE_KEY="your-anon-or-service-role-key"
Helper script:
This skill uses the shared Supabase API helper. Make sure to source it:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
Common Operations
SELECT - Query Data
Basic select all:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
supabase_get "/rest/v1/your_table?select=*"
Select specific columns:
supabase_get "/rest/v1/users?select=id,name,email"
Filter results:
supabase_get "/rest/v1/users?select=*&[email protected]"
supabase_get "/rest/v1/products?select=*&price=gt.100"
supabase_get "/rest/v1/orders?select=*&quantity=lte.10"
supabase_get "/rest/v1/users?select=*&name=like.*John*"
supabase_get "/rest/v1/products?select=*&category=in.(electronics,books)"
supabase_get "/rest/v1/users?select=*&deleted_at=is.null"
Order and limit:
supabase_get "/rest/v1/posts?select=*&order=created_at.asc"
supabase_get "/rest/v1/posts?select=*&order=created_at.desc"
supabase_get "/rest/v1/posts?select=*&limit=10"
supabase_get "/rest/v1/posts?select=*&limit=10&offset=20"
supabase_get "/rest/v1/posts?select=*" -H "Range: 0-9"
Complex queries:
supabase_get "/rest/v1/products?select=*&category=eq.electronics&price=gt.100"
supabase_get "/rest/v1/users?select=*&or=(status.eq.active,status.eq.pending)"
supabase_get "/rest/v1/users?select=*,posts(*)&posts.published=eq.true"
INSERT - Add Data
Insert single row:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
supabase_post "/rest/v1/users" '{
"name": "John Doe",
"email": "[email protected]",
"age": 30
}'
Insert multiple rows:
supabase_post "/rest/v1/users" '[
{
"name": "Alice Smith",
"email": "[email protected]"
},
{
"name": "Bob Jones",
"email": "[email protected]"
}
]'
Upsert (insert or update if exists):
curl -s -X POST \
"${SUPABASE_URL}/rest/v1/users" \
-H "apikey: ${SUPABASE_KEY}" \
-H "Authorization: Bearer ${SUPABASE_KEY}" \
-H "Content-Type: application/json" \
-H "Prefer: resolution=merge-duplicates" \
-d '{
"id": 1,
"name": "Updated Name",
"email": "[email protected]"
}'
UPDATE - Modify Data
Update rows matching filter:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
supabase_patch "/rest/v1/users?id=eq.123" '{
"name": "Updated Name",
"email": "[email protected]"
}'
supabase_patch "/rest/v1/products?category=eq.electronics" '{
"discount": 10
}'
DELETE - Remove Data
Delete rows matching filter:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
supabase_delete "/rest/v1/users?id=eq.123"
supabase_delete "/rest/v1/logs?created_at=lt.2023-01-01"
RPC - Call Database Functions
Execute stored procedures:
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"
supabase_post "/rest/v1/rpc/function_name" '{}'
supabase_post "/rest/v1/rpc/calculate_total" '{
"user_id": 123,
"start_date": "2023-01-01",
"end_date": "2023-12-31"
}'
Filter Operators Reference
| Operator |
Description |
Example |
eq |
Equals |
id=eq.123 |
neq |
Not equals |
status=neq.deleted |
gt |
Greater than |
age=gt.18 |
gte |
Greater than or equal |
price=gte.100 |
lt |
Less than |
quantity=lt.10 |
lte |
Less than or equal |
score=lte.50 |
like |
Pattern match (case-sensitive) |
name=like.*John* |
ilike |
Pattern match (case-insensitive) |
email=ilike.*@gmail.com |
is |
Check for exact value (null, true, false) |
deleted_at=is.null |
in |
In list |
status=in.(active,pending) |
not |
Negate a condition |
status=not.in.(deleted,banned) |
or |
Logical OR |
or=(status.eq.active,status.eq.pending) |
and |
Logical AND |
and=(age.gte.18,age.lte.65) |
Response Formatting
Pretty print JSON (requires jq):
supabase_get "/rest/v1/users?select=*" | jq '.'
Extract specific field:
supabase_get "/rest/v1/users?select=name" | jq -r '.[].name'
Count results:
curl -s -X GET \
"${SUPABASE_URL}/rest/v1/users?select=*" \
-H "apikey: ${SUPABASE_KEY}" \
-H "Authorization: Bearer ${SUPABASE_KEY}" \
-H "Prefer: count=exact" \
-I | grep -i content-range
Common Patterns
Check if record exists
result=$(supabase_get "/rest/v1/users?select=id&[email protected]")
if [[ "$result" == "[]" ]]; then
echo "User does not exist"
else
echo "User exists"
fi
Create if not exists
existing=$(supabase_get "/rest/v1/users?select=id&[email protected]")
if [[ "$existing" == "[]" ]]; then
supabase_post "/rest/v1/users" '{
"email": "[email protected]",
"name": "Test User"
}'
echo "User created"
else
echo "User already exists"
fi
Batch operations
ids=(123 456 789)
for id in "${ids[@]}"; do
supabase_patch "/rest/v1/users?id=eq.$id" '{
"updated_at": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'"
}