Ir al contenido

Ramificación de Bases de Datos

La ramificación de bases de datos le permite crear copias instantáneas y aisladas de toda su base de datos — esquema y datos — para desarrollo, staging o pruebas. Cada rama es una base de datos PostgreSQL real creada a partir de una plantilla, por lo que es una copia de alta fidelidad sin tiempo de inactividad.

Esto es similar a la ramificación de Git, pero para su base de datos. Cree una rama, experimente con migraciones o datos, y elimínela cuando termine. Su base de datos de producción nunca se modifica.

Rebase utiliza el CREATE DATABASE ... TEMPLATE nativo de PostgreSQL para crear ramas. Esto es:

  • Instantáneo — PostgreSQL copia la plantilla a nivel de sistema de archivos
  • Alta fidelidad — esquema, datos, índices, restricciones, políticas RLS — todo se copia
  • Aislado — los cambios en la rama no afectan a la base de datos de origen

Los metadatos de las ramas se almacenan en una tabla rebase.branches en la base de datos principal, por lo que el sistema siempre sabe qué ramas existen y de dónde provienen.

La API de ramificación está disponible a través de la interfaz DatabaseAdmin del backend:

// Create a branch from the default database
await admin.createBranch("feature_auth");
// Create a branch from a specific source database
await admin.createBranch("staging", { source: "production" });

Esto crea una nueva base de datos PostgreSQL llamada rb_feature_auth (con prefijo para evitar colisiones) y la registra en la tabla de metadatos.

const branches = await admin.listBranches();
// [
// {
// name: "feature_auth",
// parentDatabase: "rebase",
// createdAt: "2026-04-15T10:30:00Z",
// sizeBytes: 52428800
// }
// ]
const branch = await admin.getBranchInfo("feature_auth");
// { name: "feature_auth", parentDatabase: "rebase", createdAt: ..., sizeBytes: ... }
await admin.deleteBranch("feature_auth");

Esto elimina la base de datos PostgreSQL y suprime los metadatos. La base de datos principal nunca puede ser eliminada.

La ramificación de bases de datos requiere que adminConnectionString esté configurada en su iniciador de PostgreSQL, ya que la creación y eliminación de bases de datos necesita privilegios elevados:

createPostgresBootstrapper({
connection: db,
schema: { tables, enums, relations },
adminConnectionString: process.env.ADMIN_CONNECTION_STRING || databaseUrl,
connectionString
})

El DatabasePoolManager gestiona automáticamente la agrupación de conexiones para las bases de datos de las ramas. Cuando se cambia a una rama, el gestor de la agrupación crea un nuevo pool de conexiones dirigido a esa base de datos.

Los nombres de las ramas se desinfectan para permitir únicamente caracteres alfanuméricos y guiones bajos. El nombre real de la base de datos PostgreSQL se prefija con rb_ para evitar colisiones:

Nombre de la ramaNombre de la base de datos
feature_authrb_feature_auth
stagingrb_staging
v2_migrationrb_v2_migration

Cree una rama para cada pull request o despliegue de previsualización. La rama obtiene una copia completa de los datos de producción, para que los revisores puedan probar con datos reales.

Antes de ejecutar una migración en producción, cree una rama y ejecute la migración allí primero. Si algo sale mal, simplemente elimine la rama.

¿Necesita probar una transformación de datos? Cree una rama, ejecute su script y verifique los resultados sin afectar la producción.

  • Conexiones activas — PostgreSQL requiere que todas las conexiones a la base de datos de origen estén cerradas antes de crear una plantilla. El servicio de ramas desconecta automáticamente los pools inactivos, pero otros clientes (por ejemplo, pgAdmin) deben desconectarse manualmente.
  • Espacio en disco — cada rama es una copia completa de la base de datos. Monitoree el uso del disco al crear muchas ramas.
  • Consultas entre bases de datos — las ramas son bases de datos PostgreSQL separadas. No puede hacer JOIN entre una rama y la base de datos principal.