TechLead
Lección 3 de 8
5 min de lectura
Supabase

Base de datos de Supabase (PostgreSQL)

Domina operaciones, consultas y modelado de datos en PostgreSQL con Supabase

Base de datos de Supabase

Supabase ofrece una base de datos PostgreSQL completa con APIs auto‑generadas. Obtienes toda la potencia de PostgreSQL incluyendo consultas complejas, joins, índices y extensiones.

🗄️ Funciones de base de datos

  • PostgreSQL completo: Todas las funciones SQL y extensiones
  • Auto APIs: REST y GraphQL generadas automáticamente
  • Editor de tablas: Interfaz visual para gestionar datos
  • Editor SQL: Ejecuta consultas SQL en el dashboard

Crear tablas

Crea tablas usando SQL en el editor SQL de Supabase:

-- Create a posts table
CREATE TABLE posts (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  title TEXT NOT NULL,
  content TEXT,
  user_id UUID REFERENCES auth.users(id),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  published BOOLEAN DEFAULT false
);

-- Create an index for faster queries
CREATE INDEX posts_user_id_idx ON posts(user_id);

Operaciones CRUD

Insertar datos

// Insert a single row
const { data, error } = await supabase
  .from('posts')
  .insert({ title: 'My First Post', content: 'Hello World!' })
  .select()

// Insert multiple rows
const { data, error } = await supabase
  .from('posts')
  .insert([
    { title: 'Post 1', content: 'Content 1' },
    { title: 'Post 2', content: 'Content 2' }
  ])
  .select()

Seleccionar datos

// Select all columns
const { data } = await supabase.from('posts').select('*')

// Select specific columns
const { data } = await supabase.from('posts').select('id, title')

// Select with filters
const { data } = await supabase
  .from('posts')
  .select('*')
  .eq('published', true)
  .order('created_at', { ascending: false })
  .limit(10)

Actualizar datos

const { data, error } = await supabase
  .from('posts')
  .update({ title: 'Updated Title', published: true })
  .eq('id', postId)
  .select()

Eliminar datos

const { error } = await supabase
  .from('posts')
  .delete()
  .eq('id', postId)

Filtrado de consultas

// Equal
.eq('column', 'value')

// Not equal
.neq('column', 'value')

// Greater than / Less than
.gt('column', value)
.lt('column', value)
.gte('column', value)
.lte('column', value)

// Pattern matching
.like('column', '%pattern%')
.ilike('column', '%pattern%')  // case-insensitive

// In array
.in('column', ['value1', 'value2'])

// Is null
.is('column', null)

// Contains (for arrays/JSON)
.contains('tags', ['react', 'nextjs'])

Joins y relaciones

// Fetch posts with author info
const { data } = await supabase
  .from('posts')
  .select(`
    id,
    title,
    user:users (
      id,
      name,
      email
    )
  `)

// Nested relations
const { data } = await supabase
  .from('posts')
  .select(`
    *,
    comments (
      id,
      content,
      user:users (name)
    )
  `)

Paginación

// Range-based pagination
const { data } = await supabase
  .from('posts')
  .select('*')
  .range(0, 9)  // First 10 items (0-9)

// With count
const { data, count } = await supabase
  .from('posts')
  .select('*', { count: 'exact' })
  .range(0, 9)

💡 Puntos clave

  • • Supabase usa PostgreSQL, obtienes todo el poder de SQL
  • • Las APIs auto‑generadas simplifican operaciones CRUD
  • • Encadena filtros para consultas complejas
  • • Usa select() con relaciones para joins eficientes

📚 Más recursos

Continuar Aprendiendo