PlanetScale

Plataforma MySQL serverless - branching Git, migraciones sin downtime, escalabilidad ilimitada

TL;DR

Qué: Una plataforma MySQL serverless con branching y cambios de esquema no bloqueantes.

Por qué: Branching estilo Git para bases de datos, migraciones sin tiempo de inactividad, escalabilidad infinita.

Quick Start

Registrarse: Ve a planetscale.com y crea una cuenta.

Instalar CLI:

brew install planetscale/tap/pscale  # macOS
# or
scoop install pscale  # Windows

Crear base de datos:

pscale auth login
pscale database create myapp --region us-east

Conectar:

pscale shell myapp main

Crear tabla:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE
);

Cheatsheet

ComandoDescripción
pscale database create nameCrear base de datos
pscale shell db branchConectar a rama
pscale branch create db nameCrear rama
pscale deploy-request create db branchCrear solicitud de despliegue
pscale connect db branchProxy de conexión local
pscale password create db branch nameCrear contraseña de conexión

Gotchas

Flujo de trabajo con ramas

# Crear rama de desarrollo
pscale branch create myapp add-orders

# Conectar a la rama
pscale shell myapp add-orders

# Hacer cambios de esquema
CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  total DECIMAL(10,2)
);

# Crear solicitud de despliegue
pscale deploy-request create myapp add-orders

# Desplegar a producción (via UI o CLI)
pscale deploy-request deploy myapp 1

Cadenas de conexión

# Generar cadena de conexión
pscale password create myapp main production-password

# Usar en aplicación
DATABASE_URL="mysql://user:password@host/database?ssl=true"

Uso con frameworks

// Prisma
// schema.prisma
datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"  // Required for PlanetScale
}

// Drizzle
import { drizzle } from 'drizzle-orm/planetscale-serverless';
import { connect } from '@planetscale/database';

const connection = connect({
  url: process.env.DATABASE_URL
});
const db = drizzle(connection);

Sin claves foráneas (usar a nivel de aplicación)

// PlanetScale no soporta claves foráneas para migraciones en línea
// Manejar relaciones en el código de aplicación

// Con Prisma relationMode: "prisma"
model User {
  id     Int     @id @default(autoincrement())
  orders Order[]
}

model Order {
  id     Int  @id @default(autoincrement())
  userId Int
  user   User @relation(fields: [userId], references: [id])
}

Next Steps