fix(migrate): detectar tablas faltantes aunque migración esté registrada

Si una migración está en la tabla migrations pero la tabla que crea ya
no existe en la BD (ej. Coolify recreó la DB), el sistema la re-ejecuta
automáticamente. Esto evita el error anterior donde 10 lab migrations
estaban registradas como ejecutadas pero las tablas no existían.
This commit is contained in:
Lizandro Guarnizo
2026-03-12 09:46:07 -05:00
parent 01ea867229
commit 33dfc0cf71
+31 -3
View File
@@ -69,9 +69,37 @@ try {
// Verificar si ya fue ejecutada
if (in_array($filename, $executedFiles)) {
echo "⏭️ Saltando $filename (ya ejecutada)\n";
$skipped_count++;
continue;
// Verificación extra: si el SQL crea tablas, comprobar que realmente existan.
// Si alguna tabla del archivo no existe, re-ejecutar la migración.
$sqlRaw = file_get_contents($file);
preg_match_all(
'/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?`?(\w+)`?/i',
$sqlRaw,
$tableMatches
);
$missingTable = false;
foreach ($tableMatches[1] as $tableName) {
$rows = $db->fetchAll(
"SELECT COUNT(*) as cnt FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name = ?",
[$tableName]
);
if (empty($rows) || ($rows[0]['cnt'] ?? 0) == 0) {
$missingTable = $tableName;
break;
}
}
if ($missingTable) {
echo "⚠️ $filename registrada pero tabla '$missingTable' no existe — re-ejecutando\n";
// Quitar del registro para re-ejecutar
$db->execute("DELETE FROM migrations WHERE filename = ?", [$filename]);
$executedFiles = array_diff($executedFiles, [$filename]);
// Continúa a la ejecución abajo
} else {
echo "⏭️ Saltando $filename (ya ejecutada)\n";
$skipped_count++;
continue;
}
}
echo "🔄 Ejecutando migración: $filename\n";