36248-vm/db/migrate.php
2025-11-25 07:51:50 +00:00

71 lines
2.3 KiB
PHP

<?php
// Simple, idempotent migration and seeding script.
require_once __DIR__ . '/config.php';
function run_migrations(PDO $pdo): void
{
$migrationsDir = __DIR__ . '/migrations';
if (!is_dir($migrationsDir)) {
echo "Migrations directory not found.\n";
return;
}
$files = glob($migrationsDir . '/*.sql');
sort($files);
foreach ($files as $file) {
echo "Running migration: " . basename($file) . "...\n";
$sql = file_get_contents($file);
if ($sql === false) {
echo "Failed to read migration file: " . basename($file) . "\n";
continue;
}
try {
$pdo->exec($sql);
echo "Success.\n";
} catch (PDOException $e) {
echo "Error running migration " . basename($file) . ": " . $e->getMessage() . "\n";
}
}
}
function seed_data(PDO $pdo): void
{
$products = [
['name' => 'Milk 1L', 'retailer' => 'Pick n Pay', 'price' => 25.99],
['name' => 'Milk 1L', 'retailer' => 'Checkers', 'price' => 24.99],
['name' => 'Bread (White)', 'retailer' => 'Pick n Pay', 'price' => 15.50],
['name' => 'Bread (White)', 'retailer' => 'Checkers', 'price' => 14.99],
['name' => 'Eggs (12 pack)', 'retailer' => 'Pick n Pay', 'price' => 32.00],
['name' => 'Eggs (12 pack)', 'retailer' => 'Checkers', 'price' => 31.50],
['name' => 'Cheese (250g)', 'retailer' => 'Pick n Pay', 'price' => 55.00],
['name' => 'Cheese (250g)', 'retailer' => 'Checkers', 'price' => 52.99],
];
$stmt = $pdo->prepare(
'INSERT INTO products (name, retailer, price) VALUES (:name, :retailer, :price)
ON DUPLICATE KEY UPDATE price = VALUES(price)'
);
echo "\nSeeding data...\n";
foreach ($products as $product) {
try {
$stmt->execute($product);
echo "Seeded/Updated: " . $product['name'] . " (" . $product['retailer'] . ")\n";
} catch (PDOException $e) {
echo "Error seeding " . $product['name'] . ": " . $e->getMessage() . "\n";
}
}
echo "Seeding complete.\n";
}
try {
$pdo = db();
run_migrations($pdo);
seed_data($pdo);
echo "\nDatabase setup complete!\n";
} catch (PDOException $e) {
die("Database connection failed: " . $e->getMessage() . "\n");
}