Files
svc-essensplanung/bin/migrate-sqlite-to-pg.sh
T
jens 76690c919c Migriere Persistenz von SQLite zu PostgreSQL (postgresql.lan:5432/essens)
- Dockerfile: pdo_pgsql installieren
- migrations: Postgres-Dialekt (SERIAL, TIMESTAMP(0), TEXT)
- compose/.env(.dist): postgresql://DATABASE_URL (Passwort via .env.local)
- bin/migrate-sqlite-to-pg.sh: einmaliger Datenimport SQLite->PG
2026-09-25 16:52:28 +02:00

41 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Einmalige Migration: SQLite (/data/essens.db, Volume essens_data) -> PostgreSQL (postgresql.lan/essens)
# Läuft auf docker1 im Stack-Verzeichnis. Erwartet: .env.local enthält DATABASE_URL="postgresql://essens:<pw>@postgresql.lan:5432/essens?..."
set -euo pipefail
cd "$(dirname "$0")/.."
DB_URL=$(grep -m1 '^DATABASE_URL=' .env.local | sed 's/^DATABASE_URL=//; s/^"//; s/"$//')
PG_USER=$(sed -n 's|.*://\([^:@]*\):.*|\1|p' <<<"$DB_URL")
PG_PASS=$(sed -n 's|.*://[^:@]*:\([^@]*\)@.*|\1|p' <<<"$DB_URL")
PG_HOST=$(sed -n 's|.*@\([^:/?]*\).*|\1|p' <<<"$DB_URL")
PG_DB=$(sed -n 's|.*:/\([^?]*\).*|\1|p' <<<"$DB_URL")
export PGPASSWORD="$PG_PASS"
echo "== 1) SQLite-Export (CSV) aus dem laufenden Container"
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
docker exec svc-essensplanung sh -c 'sqlite3 -cmd ".nullvalue NULL" -csv /data/essens.db "SELECT * FROM essens_user;"' > "$TMP/essens_user.csv"
docker exec svc-essensplanung sh -c 'sqlite3 -cmd ".nullvalue NULL" -csv /data/essens.db "SELECT * FROM essens_mahlzeiten;"' > "$TMP/essens_mahlzeiten.csv"
echo " essens_user: $(wc -l < "$TMP/essens_user.csv") Zeilen"
echo " essens_mahlzeiten: $(wc -l < "$TMP/essens_mahlzeiten.csv") Zeilen"
echo "== 2) Schema-Migrations auf PostgreSQL"
docker compose run --rm --no-deps app bin/console doctrine:migrations:migrate --no-interaction
echo "== 3) Datenimport via COPY"
psql -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" <<EOF
BEGIN;
COPY essens_user (id, username, email, kc_sub, created_am, updated_am) FROM STDIN WITH (FORMAT csv);
$(cat "$TMP/essens_user.csv")
\.
COPY essens_mahlzeiten (id, name, notiz, wochentage, sort_order, status, gegessen_am, erstellt_am, aktualisiert_am) FROM STDIN WITH (FORMAT csv);
$(cat "$TMP/essens_mahlzeiten.csv")
\.
SELECT setval('essens_user_id_seq', COALESCE(MAX(id), 0) + 1, false) FROM essens_user;
SELECT setval('essens_mahlzeiten_id_seq', COALESCE(MAX(id), 0) + 1, false) FROM essens_mahlzeiten;
COMMIT;
EOF
echo "== 4) Verifikation"
psql -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" -c 'SELECT (SELECT count(*) FROM essens_user) AS users, (SELECT count(*) FROM essens_mahlzeiten) AS mahlzeiten;'