Eksportuj zdalną tabelę Postgres do pliku CSV na komputerze lokalnym

16

Mam dostęp tylko do odczytu do bazy danych na zdalnym serwerze. Więc mogę wykonać:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Ale na tym serwerze nie mam uprawnień do tworzenia / zapisywania pliku, więc muszę to zrobić na moim komputerze lokalnym.

Kiedy łączę się ze zdalną bazą danych, jak mogę wykonać polecenie zapisania pliku na moim komputerze lokalnym zamiast na serwerze zdalnym?

Lub jak mogę wykonać polecenie Linuksa, aby połączyć się ze zdalną bazą danych, wykonać zapytanie i zapisać dane wyjściowe jako plik na moim komputerze lokalnym?

tasmański
źródło

Odpowiedzi:

29

Oba zaproponowane już podejścia wydają się niepotrzebnie skomplikowane.

Wystarczy użyć psqlwbudowanego \copypolecenia, które działa tak samo jak po stronie serwera, COPYale wykonuje kopię za pośrednictwem protokołu przewodowego do klienta i używa ścieżek klienta.

Ponieważ jest to psqlpolecenie odwrotnego ukośnika, pomijasz końcowy średnik, np .:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Zobacz\copy w instrukcji obsługi psqlpolecenia i dokumentacji COPYpolecenia .

Tak jak COPYmożna skorzystać \copyz (SELECT ...)zapytania zamiast nazwy tabeli podczas kopiowania danych (ale nie w).


Generalnie gorszą alternatywą, która może być przydatna w kilku ograniczonych sytuacjach, jest użycie:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

i użyj -oprzekierowania wyjścia flagi lub powłoki, aby zapisać dane wyjściowe w pliku. Prawie zawsze powinieneś używać \copyzamiast tego.

Craig Ringer
źródło
Ale to nie pozwala na transakcje :(
Reza S
Jasne, że tak. Użyj dokumentu tutaj, aby nakarmić psqlskrypt, zaczynając od BEGIN, a następnie wykonując \copypolecenia, a następnie COMMIT. Lub użyj psql -fdo uruchomienia skryptu zamiast korzystania z dokumentu tutaj.
Craig Ringer
Dzięki, że wróciłem ... to właśnie skończyłem i zadziałało =)
Reza S
Możesz użyć -Azamiast, -P format=unaligneda także myślę, że potrzebujesz-P fieldsep=,
Evan Carroll
2

Polecenie Linux to:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
tasmański
źródło
1
To nie wygeneruje CSV, spowoduje sformatowanie tekstu wyjściowego. Jeśli dodasz -t -P format=unaligned do tego polecenia, dostaniesz coś nieco bliższego, na przykład błędny plik CSV rozdzielany potokami, ale potoki w tekście nie zostaną usunięte, więc byłoby to nieprawidłowe.
Craig Ringer
Och, też chciałbyś -P fieldsep=','poza tym, że byłoby to jeszcze bardziej prawdopodobne, że spowoduje błędy z powodu braku ucieczki. -P fieldsep_zero=onbyłoby OK, gdybyś nie miał nic przeciwko parsowaniu tekstu rozdzielanego znakami pustymi, ponieważ puste bajty nie mogą wystąpić psqlnaturalnie w danych wyjściowych.
Craig Ringer