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:
+31
-3
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user