04 — Base de datos PlanetScale explicada
← Anterior: 03 — Servicios en la nube explicados
PlanetScale es la base de datos Postgres gestionada que usaremos en lugar de Cloud SQL de GCP. Este capítulo explica cómo funciona, por qué la elegimos y los conceptos clave que necesitas entender antes de configurarla.
¿Qué es PlanetScale?
PlanetScale es una base de datos Postgres gestionada. Es sin servidor, lo que significa:
- Sin gestión de servidores (sin parches, sin respaldos que gestionar, sin escalado que preocupar)
- Te conectas a una URL de base de datos — PlanetScale maneja todo lo demás
- Escala automáticamente para manejar picos de tráfico
Comparado con Cloud SQL
| Característica | Cloud SQL | PlanetScale |
|---|---|---|
| Gestión de servidores | Tú lo gestionas | Completamente gestionado |
| Escalado | Manual (elegir tamaño de instancia) | Automático (sin servidor) |
| Ramificación | No | Sí (como ramas de Git) |
| Nivel gratuito | No | No (planes de pago desde $5/mes) |
| Costo | ~$7–10/mes (comienza inmediatamente) | $5/mes para Postgres de un solo nodo |
Conceptos clave
Base de datos vs Rama
En PlanetScale:
- Base de datos — la base de datos de producción donde viven tus datos
- Rama — una copia de la base de datos en la que puedes desarrollar, probar y fusionar de vuelta
Esto es como Git:
- Rama main = base de datos de producción
- Ramas de feature = ramas de desarrollo
- Fusionar = los cambios de esquema se aplican a producción
Cambios de esquema como despliegues
El flujo de trabajo de ramificación de PlanetScale funciona muy bien con GitHub Actions:
- Crea una rama para tu feature
- Haz cambios de esquema (agregar columnas, etc.)
- Abre un PR — PlanetScale puede ejecutar una "revisión de esquema" para mostrar qué cambiaría
- Fusiona a main — PlanetScale aplica los cambios sin tiempo de inactividad
PlanetScale soporta cambios de esquema no bloqueantes — alterar tablas sin bloquearlas.
Cadena de conexión
PlanetScale te da una cadena de conexión (como postgres://user:password@aws.connect.psdb.cloud/db?sslmode=require). Almacenas esto en Secret Manager y lo usas en el DATABASE_URL de Django.
¿Por qué PlanetScale para Django?
Ventajas
- Sin servidor — sin base de datos de servidor que gestionar
- Ramificación — perfecto para probar migraciones antes de que lleguen a producción
- Sin mantenimiento — sin respaldos que ejecutar, sin parches que aplicar
- Accesible — Postgres de un solo nodo comienza en $5/mes
- Compatible con Django — funciona con drivers Postgres estándar
Desventajas
- Sin acceso superusuario — no puedes hacer SSH o ejecutar
psqldirectamente (es una conexión de solo lectura) - Algunas características de Postgres limitadas — no 100% de paridad con Postgres estándar (sin claves foráneas, algunos comportamientos de bloqueo difieren)
- Costo — la base de datos de producción cuesta dinero
Notas de compatibilidad para Django
PlanetScale es compatible con el ORM de Django, pero hay algunas advertencias:
-
Sin restricciones de clave foránea — PlanetScale no soporta claves foráneas debido a su naturaleza distribuida. Necesitarás usar
db_constraint=Falseen campos ForeignKey o manejar la integridad referencial a nivel de aplicación. -
Sin
SELECT FOR UPDATE— algunas consultas de bloqueo no están soportadas. -
Migraciones — las migraciones de Django funcionan bien, pero no puedes usar
migratepara crear la base de datos inicial (PlanetScale la crea por ti vía su CLI).
Para la mayoría de las apps Django, estas limitaciones son manejables. Si necesitas características completas de Postgres, considera usar Cloud SQL en su lugar.
CLI de PlanetScale
PlanetScale tiene una CLI (pscale) para gestionar bases de datos y ramas. La necesitarás para:
- Crear la base de datos inicial
- Crear ramas
- Ejecutar migraciones contra una rama
- Conectarte a una rama localmente
Instálala:
# macOS
brew install planetscale/tap/pscale
# Linux
curl -fsSL https://github.com/planetscale/cli/releases/download/v0.219.0/pscale_0.219.0_linux_amd64.tar.gz | tar -xz
sudo mv pscale /usr/local/bin/
# Verificar
pscale version
Autenticarse:
Creando la base de datos
Vía el dashboard de PlanetScale
- Ve a app.planetscale.com
- Crea una cuenta
- Crea una nueva base de datos (llámala
mycoolproject) - Anota la cadena de conexión
Vía la CLI
Ramas de base de datos
Desarrollo vs Producción
-
Rama de desarrollo — la rama predeterminada cuando creas una base de datos. Úsala para desarrollo local y pruebas de migraciones.
-
Rama de producción — la base de datos de producción. Solo fusiona cambios de esquema aquí después de probar en la rama de desarrollo.
Creando una rama
# Crear una rama para trabajar en un feature
pscale branch create mycoolproject feature-add-users
# Listar ramas
pscale branch list mycoolproject
# Eliminar una rama cuando termines
pscale branch delete mycoolproject feature-add-users
Conectándose a una rama
Cada rama tiene su propia cadena de conexión. Usa la rama de desarrollo para desarrollo local, y solo conéctate a producción al desplegar.
# Obtener cadena de conexión para una rama (para desarrollo local)
pscale connect mycoolproject development
Esto abre un proxy local para que puedas conectarte a la rama de PlanetScale como si fuera una base de datos local.
Conectándose desde Django
El formato de la cadena de conexión
Las cadenas de conexión de PlanetScale se ven así:
Almacenar en Secret Manager
Almacena esto en Secret Manager usando la CLI de gcloud:
echo -n "postgres://user:password@aws.connect.psdb.cloud/mycoolproject?sslmode=require" \
| gcloud secrets create DATABASE_URL --data-file=-
Configuración de Django
Django lee esto vía django-environ:
# web/core/settings/prod.py
import environ
env = environ.Env()
DATABASES = {
'default': env.db('DATABASE_URL', default='sqlite:///db.sqlite3')
}
La variable de entorno DATABASE_URL se inyecta desde Secret Manager en tiempo de ejecución del contenedor. No se necesita configuración especial de PlanetScale — funciona con drivers Postgres estándar.
Requisito de SSL/TLS
PlanetScale requiere conexiones SSL. El ?sslmode=require en la cadena de conexión maneja esto. La mayoría de los drivers Postgres lo soportan de fábrica.
Si ves errores de SSL, verifica que tu cadena de conexión incluya sslmode=require.
PlanetScale vs Cloud SQL
Aquí está la matriz de decisión:
| Escenario | Usar PlanetScale | Usar Cloud SQL |
|---|---|---|
| Empezando / aprendiendo | ✓ (planes de pago desde $5/mes) | ✗ (sin nivel gratuito) |
| App Django simple | ✓ | ✓ |
| Necesitas claves foráneas | ✗ | ✓ |
| Necesitas características completas de Postgres | ✗ | ✓ |
| Quieres flujo de trabajo de ramificación | ✓ | ✗ |
| Prefieres sin servidor | ✓ | ✗ |
| Presupuesto ajustado | ✗ (pago requerido) | ✓ (~$7/mes) |
Para esta guía, usamos PlanetScale por el flujo de trabajo de ramificación que combina bien con GitHub Actions, y el escalado sin servidor.
Resumen: lo que hemos hecho
- Creamos una base de datos PlanetScale (vía dashboard o CLI)
- Almacenamos la cadena de conexión en Secret Manager
- Configuramos Django para leer
DATABASE_URLdesde el entorno
La infraestructura de Terraform (Artifact Registry, Cloud Run, IAM, otros secretos) se configura en los siguientes capítulos.
Navegación
- 01 — Introduction: What We're Building
- 02 — Terraform Overview
- 03 — Cloud Services Explained
- 04 — PlanetScale Database Explained (Capítulo actual)
- 05 — Project Setup & Terraform State
- 06 — GCP Project & APIs
- 07 — Artifact Registry
- 08 — Secrets Management
- 09 — Cloud Storage
- 10 — Service Accounts & IAM
- 11 — Cloud Run
- 12 — Cloud Tasks & Scheduler
- 13 — Dockerfile
- 14 — First Deploy
- 15 — Custom Domain & SSL
- 16 — Workload Identity Federation
- 17 — GitHub Actions CI/CD
- 18 — Quick Reference