Jak mogę zrzucić wszystkie tabele do CSV dla schematu PostgreSQL?

11

Mam bazę danych z dużą ilością schematów i chcę zrzucić każdą zawartość tabeli do pliku CSV. Mam świadomość polecenia COPY, ale nie jestem pewien, jak napisać skrypt, który przeczyta wszystkie tabele w schemacie i wykona COPY przeciwko nim.

robertpostill
źródło

Odpowiedzi:

18

Oto skrypt powłoki, który może robić, co chcesz:

SCHEMA="myschema"
DB="mydb"

psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" $DB |\
  while read TBL; do
    psql -c "COPY $SCHEMA.$TBL TO STDOUT WITH CSV" $DB > $TBL.csv
  done

Upewnij się, że ustawiłeś zmienne DB i SCHEMA na konkretną bazę danych i schemat.

Zawijanie polecenia psql używa flag A i t, aby utworzyć listę tabel z ciągu przekazywanego do polecenia c.

Ziggy Crueltyfree Zeitgeister
źródło
3

Jeśli chcesz wyeksportować wszystkie schematy, oto skrypt

PGDATABASE="db"
PGUSER="user"

psql -Atc "select schema_name from information_schema.schemata" |\
    while read SCHEMA; do
    if [[ "$SCHEMA" != "pg_catalog" && "$SCHEMA" != "information_schema" ]]; then
        psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" |\
            while read TBL; do
                psql -c "COPY $SCHEMA.$TBL TO STDOUT WITH CSV DELIMITER ';' HEADER ENCODING 'UTF-8'" > $SCHEMA.$TBL.csv
            done
    fi
    done
Toilal
źródło