migrate-sqlite-to-pg: PHP-basierter Import (PDO, korrekte NULLs)
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
// Einmalige Daten-Migration: SQLite /data/essens.db -> 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);
|
||||||
|
|
||||||
|
$pg = new PDO($pgUrl);
|
||||||
|
$pg->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
|
$copy = $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");
|
||||||
|
$copy->commit();
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
$copy->rollBack();
|
||||||
|
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";
|
||||||
Reference in New Issue
Block a user