36782-vm/db/migrate.php
2025-12-12 14:13:03 +00:00

63 lines
1.7 KiB
PHP

<?php
require_once __DIR__ . '/config.php';
echo "Running migrations...\n";
try {
$pdo = db();
// 1. Create schema_migrations table if it doesn't exist
$pdo->exec("
CREATE TABLE IF NOT EXISTS schema_migrations (
version VARCHAR(255) NOT NULL PRIMARY KEY,
applied_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
");
// 2. Get all migrations that have already been run
$applied_migrations = $pdo->query("SELECT version FROM schema_migrations")->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $e) {
die("A database error occurred during setup: " . $e->getMessage());
}
// 3. Get all migration files on disk
$migrationsDir = __DIR__ . '/migrations';
$all_files = glob($migrationsDir . '/*.sql');
sort($all_files);
// 4. Determine and run new migrations
foreach ($all_files as $file) {
$filename = basename($file);
if (!in_array($filename, $applied_migrations)) {
echo "Applying migration: $filename\n";
try {
$pdo->beginTransaction();
$sql = file_get_contents($file);
$pdo->exec($sql);
// Record the migration
$stmt = $pdo->prepare("INSERT INTO schema_migrations (version) VALUES (?)");
$stmt->execute([$filename]);
$pdo->commit();
echo " Success.\n";
} catch (PDOException $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
echo " Error applying migration $filename: " . $e->getMessage() . "\n";
// Stop on first error
break;
}
} else {
echo "Skipping already applied migration: $filename\n";
}
}
echo "Migrations completed.\n";