Cómo Subir las Migraciones Locales a Supabase
Cómo Subir las Migraciones Locales a Supabase
🚀 Aprende a sincronizar tus migraciones de base de datos desde tu entorno local hasta Supabase Cloud de manera segura y eficiente. Esta guía te mostrará el flujo completo de trabajo para mantener tu base de datos sincronizada.
¿Qué son las Migraciones?
Las migraciones son archivos SQL que describen los cambios en el esquema de tu base de datos:
- Creación de tablas
- Modificación de columnas
- Índices y restricciones
- Políticas de seguridad (RLS)
- Funciones y triggers
Configuración Inicial
1. Instalar Scoop (Windows Package Manager)
Primero, instala Scoop, un gestor de paquetes para Windows que facilitará la instalación de herramientas de desarrollo:
# Configurar política de ejecución para PowerShell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Instalar Scoop
iwr -useb get.scoop.sh | iex
Verifica la instalación de Scoop:
scoop --version
📖 Para más detalles sobre la instalación en Windows, consulta la documentación oficial de Supabase.
2. Agregar bucket de Supabase a Scoop
Antes de instalar la CLI de Supabase, necesitas agregar su bucket a Scoop:
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
3. Instalar CLI de Supabase con Scoop
Una vez agregado el bucket, instala la CLI de Supabase:
scoop install supabase
Verifica la instalación:
supabase --version
4. Iniciar Proyecto Local
# Inicializar proyecto Supabase
npx supabase init
# Iniciar servicios locales, solo funciona con docker
npx supabase start
5. Agregar la variable de entorno SUPABASE_ACCESS_TOKEN
# Agregar la variable de entorno, desde el CMD
set SUPABASE_ACCESS_TOKEN "tu-access-token"
tu-access-token es el token que obtienes de tu cuenta de Supabase, lo puedes obtener ingresando a tu cuenta de Supabase, luego donde aparece tu imagen de perfil, en la sección de configuración de tu proyecto (preferencias de la cuenta), en la pestaña tokens de acceso.
6. Conectar con Proyecto Remoto
# Enlazar con tu proyecto en Supabase Cloud.
# Te pedirá que elijas el proyecto remoto, selecciona el que deseas.
npx supabase link
Flujo de Trabajo de Migraciones
1. Crear Nueva Migración
# Crear una nueva migración
npx supabase migration new crear_tabla_usuarios
Esto creará un archivo en supabase/migrations/ con timestamp:
-- migrations/20240101000000_crear_tabla_usuarios.sql
2. Escribir la Migración
Edita el archivo de migración:
-- Crear tabla de usuarios
CREATE TABLE usuarios (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
nombre TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Crear índice
CREATE INDEX idx_usuarios_email ON usuarios(email);
-- Crear política de seguridad
CREATE POLICY "Usuarios pueden ver su propio perfil" ON usuarios
FOR SELECT USING (auth.uid() = id);
3. Aplicar Migración Localmente
# Aplicar migraciones en la base de datos local
npx supabase db push
4. Probar Cambios Locales
Antes de subir a producción, prueba tus cambios:
# Ver estado de la base de datos
npx supabase status
# Ver logs si hay errores
npx supabase logs db
# Conectarte a la base de datos local
npx supabase db shell
5. Subir a Supabase Cloud
# Sincronizar migraciones con el proyecto remoto
npx supabase db push --remote
Comandos Esenciales
Ver Historial de Migraciones
# Listar todas las migraciones
npx supabase migration list
# Ver detalles de una migración específica
npx supabase migration show 20240101000000_crear_tabla_usuarios
Resetear Base de Datos
# Resetear base de datos local (¡cuidado! borra todo)
npx supabase db reset
# Resetear y volver a aplicar migraciones
npx supabase db reset --linked
Backup y Restore
# Hacer backup de la base de datos
npx supabase db dump --data-only > backup.sql
# Restaurar desde backup
npx supabase db restore backup.sql
Buenas Prácticas
1. Nomenclatura de Migraciones
Usa nombres descriptivos y consistentes:
# ✅ Buenas prácticas
npx supabase migration new crear_tabla_perfiles
npx supabase migration new agregar_campo_avatar_a_perfiles
npx supabase migration new crear_indice_email_usuarios
# ❌ Evitar
npx supabase migration new fix
npx supabase migration new temp
npx supabase migration new 123
2. Migraciones Reversibles
Escribe migraciones que puedan revertirse:
-- migrations/20240101000000_crear_tabla_usuarios.sql
CREATE TABLE usuarios (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
nombre TEXT
);
-- migrations/20240101000001_crear_tabla_usuarios_down.sql
DROP TABLE IF EXISTS usuarios;
3. Validar Antes de Subir
# Verificar sintaxis SQL
npx supabase db diff --use-migra
# Comparar local con remoto
npx supabase db diff --remote
4. Manejo de Conflictos
Si hay conflictos entre local y remoto:
# Forzar sincronización (¡cuidado! puede sobreescribir datos)
npx supabase db push --remote --force
# O mejor: resolver conflictos manualmente
npx supabase db diff --remote > conflictos.sql
# Editar conflictos.sql manualmente
# Aplicar cambios uno por uno
Flujo de Trabajo Recomendado
Desarrollo Diario
# 1. Crear nueva migración
npx supabase migration new mi_cambio
# 2. Editar el archivo SQL
# (escribir los cambios)
# 3. Aplicar localmente
npx supabase db push
# 4. Probar extensamente
# (usar la app, hacer pruebas unitarias)
# 5. Subir a staging/producción
npx supabase db push --remote
Trabajo en Equipo
# 1. Pull de cambios del equipo
git pull origin main
# 2. Aplicar migraciones nuevas
npx supabase db push
# 3. Crear tus cambios
npx supabase migration new mi_feature
# 4. Aplicar y probar localmente
npx supabase db push
# 5. Commit y push
git add .
git commit -m "Add mi_feature migration"
git push origin main
# 6. Subir migraciones a producción
npx supabase db push --remote
Solución de Problemas Comunes
Error: “Migration already applied”
# Verificar estado de migraciones
npx supabase migration list
# Saltar migración ya aplicada
npx supabase db push --skip-migration 20240101000000
Error: “Connection timeout”
# Verificar conexión
npx supabase status
# Reintentar con timeout extendido
npx supabase db push --remote --timeout 60
Error: “Schema mismatch”
# Comparar esquemas
npx supabase db diff --remote
# Resetear y sincronizar desde cero
npx supabase db reset --linked
npx supabase db push --remote
Automatización con CI/CD
GitHub Actions Example
name: Deploy Migrations
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Supabase CLI
run: |
curl -L https://github.com/supabase/cli/releases/latest/download/supabase_linux_amd64.tar.gz | tar xz
sudo mv supabase /usr/local/bin/
- name: Deploy migrations
run: |
supabase link --project-ref ${{ secrets.SUPABASE_PROJECT_REF }}
supabase db push --remote
env:
SUPABASE_DB_PASSWORD: ${{ secrets.SUPABASE_DB_PASSWORD }}
Tips Avanzados
1. Migraciones Condicionales
-- Solo ejecutar si la tabla no existe
CREATE TABLE IF NOT EXISTS usuarios (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
email TEXT UNIQUE NOT NULL
);
-- Solo agregar columna si no existe
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'usuarios' AND column_name = 'avatar_url'
) THEN
ALTER TABLE usuarios ADD COLUMN avatar_url TEXT;
END IF;
END $$;
2. Datos de Prueba
-- Insertar datos de desarrollo
INSERT INTO usuarios (email, nombre) VALUES
('test@example.com', 'Usuario Test'),
('dev@example.com', 'Usuario Dev')
ON CONFLICT (email) DO NOTHING;
3. Migraciones de Performance
-- Crear índices concurrentemente
CREATE INDEX CONCURRENTLY idx_usuarios_email ON usuarios(email);
-- Actualizar datos en lotes
UPDATE usuarios
SET nombre = UPPER(nombre)
WHERE id IN (
SELECT id FROM usuarios LIMIT 1000
);
Conclusión
Las migraciones son fundamentales para mantener la integridad y consistencia de tu base de datos a través de diferentes entornos. Con la CLI de Supabase, tienes control total sobre el ciclo de vida de tus cambios:
✅ Desarrollo local rápido
✅ Control de versiones
✅ Despliegue seguro
✅ Colaboración en equipo
✅ Rollbacks confiables
Recuerda siempre probar tus migraciones en un entorno de desarrollo antes de aplicarlas en producción.
📖 Para más información, consulta la documentación oficial de Supabase.