PostgreSQL (DATABASE_URL) // Aufruf im App-Container: php bin/migrate-sqlite-to-pg.php declare(strict_types=1); $sqlitePath = '/data/essens.db'; $pgUrl = $_SERVER['DATABASE_URL'] ?? getenv('DATABASE_URL'); if (!$pgUrl) { fwrite(STDERR, "DATABASE_URL nicht gesetzt\n"); exit(1); } $sqlite = new PDO('sqlite:' . $sqlitePath); $sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // PDO pgsql akzeptiert keine // URLs -> DSN-Form preg_match('#^[a-z+]+://([^:@/]*)(?::([^@/]*))?@([^:/?]*)(?::(\d+))?/([^?]*)(?:\?(.*))?$#', $pgUrl, $m); [$authUser, $authPass, $host, $port, $dbname] = [$m[1] ?? 'essens', $m[2] ?? '', $m[3] ?? 'localhost', $m[4] ?? '5432', $m[5] ?? 'essens']; $pg = new PDO( sprintf('pgsql:host=%s;port=%s;dbname=%s;user=%s;password=%s', $host, $port, $dbname, $authUser, $authPass), $authUser, $authPass, ); $pg->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pg->beginTransaction(); try { $userStmt = $pg->prepare('INSERT INTO essens_user (id, username, email, kc_sub, created_am, updated_am) VALUES (?, ?, ?, ?, ?, ?)'); $mealStmt = $pg->prepare('INSERT INTO essens_mahlzeiten (id, name, notiz, wochentage, sort_order, status, gegessen_am, erstellt_am, aktualisiert_am) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'); foreach ($sqlite->query('SELECT id, username, email, kc_sub, created_am, updated_am FROM essens_user') as $r) { $userStmt->execute([$r['id'], $r['username'], $r['email'], $r['kc_sub'] ?: null, $r['created_am'] ?: null, $r['updated_am'] ?: null]); } foreach ($sqlite->query('SELECT id, name, notiz, wochentage, sort_order, status, gegessen_am, erstellt_am, aktualisiert_am FROM essens_mahlzeiten') as $r) { $mealStmt->execute([ $r['id'], $r['name'], $r['notiz'] ?: null, $r['wochentage'] ?: null, (int) $r['sort_order'], $r['status'], $r['gegessen_am'] ?: null, $r['erstellt_am'] ?: null, $r['aktualisiert_am'] ?: null, ]); } $pg->exec("SELECT setval('essens_user_id_seq', COALESCE(MAX(id), 0) + 1, false) FROM essens_user"); $pg->exec("SELECT setval('essens_mahlzeiten_id_seq', COALESCE(MAX(id), 0) + 1, false) FROM essens_mahlzeiten"); $pg->commit(); } catch (Throwable $e) { $pg->rollBack(); fwrite(STDERR, get_class($e) . ': ' . $e->getMessage() . "\n"); throw $e; } $u = $pg->query('SELECT count(*) FROM essens_user')->fetchColumn(); $m = $pg->query('SELECT count(*) FROM essens_mahlzeiten')->fetchColumn(); echo "Import ok: $u User, $m Mahlzeiten\n";