Wartbarkeit, Stabilität und Effektivität

PostgreSQL-Tabellen zur Versionierung dumpen

2010-02 01
Mo, 2010-02-01 13:27 -- lux

Normalerweise eignen sich so große Dateien nicht zur Versionierung, bei Tests, die immer die Gleiche Datenbasis haben sollen, macht es jedoch Sinn und erspart das komplette zurückrollen einer ganzen DB.

Nach dem Ausführen des Batchs kann man die Dateien einfach durch hg add in ein bestehendes Repository hinzufügen (Erzeugen eines Repositories mit hg init) und mit hg commit -m "Nachricht" einchecken. Trotz großer Datenmengen verhält sich mercurial doch recht performant.

@echo off
REM Parameter abpruefen
if "%1" == "" (
    echo Bitte DB-Name angeben
    goto end
)
REM sammeln der Tabellennamen aus Schema public
psql -U postgres -d %1 -t -c "SELECT tablename FROM pg_tables WHERE schemaname = 'public'" > tables.list
REM sortieren und sortierung speichern
sort tables.list /O tables.list
REM jede Tabelle einzeln sichern
for /F %%f IN (tables.list) do (
    psql -U postgres -d %1 -c "COPY %%f to STDOUT" > %%f.copy
        REM sortieren (nach erster Tabellenspalte)
    sort %%f.copy /O %%f.copy
)
REM das wars schon
:end
PAUSE

Diese Dumps lassen sich dann Tabellenweise mit

type tabelle.copy | psql -U postgres -d <db-name> -c "COPY <tabelle> FROM STDIN"

wieder in die Tabelle zurückspielen (man sollte ggf. vorher die alten Daten löschen).