Saltar a contenido

tai-sql push

tai-sql push [-s <schema>] [-d] [-v] [-f] [--no-generate] [--with-feed]

Sincroniza la base de datos con lo que declara el schema.

Empieza siempre por --dry-run --verbose

tai-sql push --dry-run --verbose

Imprime el DDL exacto que se ejecutaría, y no toca nada. Es el hábito que evita el 100 % de los disgustos.

Sin migraciones versionadas

tai-sql no tiene ficheros de migración que revisar ni un historial que reproducir. En cada ejecución compara el schema declarado con el estado real de la base de datos y genera el DDL que hace falta para que coincidan:

detectar drift → planificar DDL → validar seguridad → confirmar → ejecutar en una
transacción → regenerar recursos

Todo el DDL va en una transacción: o se aplica entero o no se aplica nada. En los motores donde el DDL no es transaccional eso no se puede garantizar, y por eso el --dry-run importa todavía más.

Los tres niveles de seguridad

Antes de ejecutar nada, cada operación se clasifica:

Nivel Qué significa Qué pasa
SAFE No puede perder datos Se ejecuta
WARNING Puede perder datos Pide confirmación (--force la salta)
BLOCKED No se puede ejecutar sobre los datos actuales Corta el push, con la solución

Un push cortado por la validación sale con código distinto de 0, así que un script que lo llame se entera.

Qué puede destruir

La respuesta corta: push aplica lo que declaras, y lo que no declaras lo elimina.

Lo que destruye datos

Cambio en el schema Qué hace en la base de datos
Quitar una columna DROP COLUMN — se pierden sus datos. WARNING si tiene filas con valor
Quitar una tabla DROP TABLE — se pierde entera
Cambiar el tipo de una columna Intenta convertir. Si los datos no caben, la transacción falla y no se aplica nada. Para hacerlo, suelta y recrea las FKs que apunten a esa columna

Lo que corta antes de empezar (BLOCKED)

  • Volver NOT NULL una columna que tiene NULLs → hay que rellenarlos antes.
  • Añadir una unique sobre una columna con duplicados.
  • Añadir una FK con filas huérfanas.
  • Cambiar la clave primaria de una tabla referenciada por una FK: el índice que respalda la PK es el que usan esas claves foráneas, y el motor no deja eliminarlo.

Se arreglan con los datos, no con el schema:

UPDATE tabla SET columna = 'valor por defecto' WHERE columna IS NULL;

Lo que no toca

  • Un índice ajeno no se elimina nunca. Si no lleva la convención de nombres de tai-sql, se da por creado a mano y se respeta, aunque el schema no lo declare.
  • Convertir una columna en autoincremental no se aplica, y por eso tampoco se reporta: exige crear una secuencia o una identidad. Hay que hacerlo a mano.

Las opciones

Opción Qué hace
-d, --dry-run Muestra el DDL y no ejecuta nada
-v, --verbose Detalle de cada paso
-f, --force No pregunta. Para CI, no para tu terminal
--no-generate No regenera el cliente al terminar (por defecto sí, si hubo cambios)
--with-feed Ejecuta el feed entre la creación de las tablas y la aplicación de las FKs
-s, --schema Sobre qué schema actuar

Cuándo regenera el cliente

Al terminar, y solo si hubo cambios en la base de datos. Si tocaste algo que no produce DDL —una descripción, un feed(), un trigger—, no regenera nada: para eso está tai-sql generate.

Si la base de datos no existe

push la crea. Para saberlo antes sin tocar nada, tai-sql ping -d.

En CI

tai-sql push --force --no-generate

--force salta las confirmaciones, pero no los BLOCKED: si una operación no se puede ejecutar sobre los datos actuales, el push corta igualmente y devuelve error.