Jak wyeksportować tabelę jako CSV z nagłówkami na Postgresql?

418

Próbuję wyeksportować tabelę PostgreSQL z nagłówkami do pliku CSV za pomocą wiersza polecenia, jednak otrzymuję go do eksportu do pliku CSV, ale bez nagłówków.

Mój kod wygląda następująco:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
źródło
Czy używasz postgres> = 8.1?
Dana the Sane
1
Myślę, że zaplanuję aktualizację do nowszej wersji, znacznie ułatwi życie
Elitmiar
1
Zobacz także stackoverflow.com/q/1517635/287948
Peter Krauss

Odpowiedzi:

594
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

zgodnie z opisem w instrukcji .

Milen A. Radev
źródło
7
Należy pamiętać, że argument HEADER został wprowadzony dopiero w wersji 8.1.
Dana the Sane
7
Co jest, powiedzmy, nieco zardzewiałe.
Milen A. Radev
65
Uwaga COPYwymaga uprawnień administratora. Użyj \COPYzamiast tego, jeśli napotkasz problemy.
fny
5
może to dać niezgodne dane wyjściowe, lepiej użyć „FORMAT csv” niż „DELIMITER”, „”. nie jestem pewien, która wersja się pojawiła
grahamrhay
37
W wersji 9.5 polecenie jest terazCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal
223

Z wiersza polecenia psql:

\COPY my_table TO 'filename' CSV HEADER

na końcu brak średnika.

Laurent Debricon
źródło
22
ta wersja jest zdecydowanie najlepsza, ponieważ COPYpolecenie wymaga dostępu administratora
Matthew O'Riordan,
2
Również dzięki temu psqlpodejściu można zapisać dane wyjściowe w dowolnym miejscu, do którego ma dostęp. Właśnie wykorzystałem to psqlpodejście do przeniesienia danych ze zdalnego serwera do pliku lokalnego. Bardzo zręczny.
Ian Gow
Znacznie lepiej, zwłaszcza podczas zapisywania w katalogu, w którym masz dostęp, ale użytkownik postgres nie.
Steve Bennett,
2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow
4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki
122

zamiast samej nazwy tabeli można również napisać zapytanie dotyczące uzyskania tylko wybranych danych kolumny.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

z uprawnieniami administratora

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
źródło
Nie sądzę, że potrzebujesz średnika kończącego w wersji psql polecenia ( \COPY ...). I przynajmniej w mojej wersji psql (9.5.2) nie musiałem podawać „DELIMITER”; domyślnie był to przecinek.
user1071847,
jak zmienia się składnia, jeśli
kopiuję
99

Kiedy nie mam uprawnień do zapisania pliku z Postgres, stwierdzam, że mogę uruchomić zapytanie z wiersza poleceń.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
źródło
7
Najlepsze dla „dowolnego środowiska”. Najlepsze dla 1. Nie potrzebujesz specjalnych uprawnień w Postgresql lub u klienta; 2. potrafi korzystać ze ścieżki względnej; oraz 3. jest bezpieczny dla prawdziwego formatu CSV (bezpieczne oferty).
Peter Krauss
34

To działa

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
źródło
10
Miły. Zauważ, że nie wydaje się, aby uciekało to przecinkami w polach, które je zawierają.
Rekurencyjnie
Lubię to, bez -F ,i używam |jako separatora. Dzięki!
dsummersl,
2
Nie jest to powszechnie uważane za funkcję eksportu, tylko kontrolowane wyświetlanie danych. Różnica jest niewielka, ale ważna: jest bardziej przeznaczona do odczytania przez człowieka niż COPYoświadczenie, które tworzy plik do ponownego użycia
Romain G
7
NIEBEZPIECZEŃSTWO to nie jest dla formatu CSV, nie działa dla tablic lub tekstu z „,” .. nie wykonuj poprawnego cytowania CSV. Użyj odpowiedzi @ Briana.
Peter Krauss,
8

W przypadku wersji 9.5, której używam, byłoby to tak:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
maytham-ɯɐɥʇʎɐɯ
źródło
7

To rozwiązanie działało dla mnie przy użyciu \copy.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
Atińska
źródło
4

Najprostszym sposobem (za pomocą psql) wydaje się być użycie --csvflagi:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
źródło
Działa to tylko w wersji PostgreSQL 12+
Dirk
3

Oto, w jaki sposób mam działającą powłokę mocy za pomocą pgsl Connnect do bazy danych Heroku PG:

Musiałem najpierw zmienić kodowanie klienta na utf8 w następujący sposób: \encoding UTF8

Następnie zrzucił dane do pliku CSV w następujący sposób:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

Użyłem ~ jako separatora, ponieważ nie lubię plików CSV, zwykle używam plików TSV, ale nie pozwala mi dodać „\ t” jako separatora, więc użyłem ~, ponieważ jest to rzadko używany znak.

Horse O'Houlihan
źródło
0

skopiuj (anysql query datawanttoexport) do 'fileablsoutepathwihname' delimiter ',' nagłówek csv;

Za pomocą tego możesz również eksportować dane.

użytkownik3767321
źródło
0

Publikuję tę odpowiedź, ponieważ żadna z podanych tutaj odpowiedzi tak naprawdę nie działała dla mnie. Nie mogłem użyćCOPY z Postgres, ponieważ nie miałem odpowiednich uprawnień. Wybrałem więc „Eksportuj wiersze siatki” i zapisałem wynik jako UTF-8.

psqlWersja podana przez @Brian również nie działa na mnie, z innego powodu. Powodem, dla którego nie zadziałało, jest to, że najwyraźniej wiersz polecenia systemu Windows (korzystałem z systemu Windows) sam wtrącał się w kodowanie. Wciąż pojawiał się ten błąd:

BŁĄD: znak o sekwencji bajtów 0x81 w kodowaniu „WIN1252” nie ma odpowiednika w kodowaniu „UTF8”

Rozwiązaniem, którego użyłem, było napisanie krótkiego skryptu JDBC (Java), który odczytuje plik CSV i wydaje instrukcje insert bezpośrednio do mojej tabeli Postgres. To działało, ale wiersz polecenia również działałby, gdyby nie zmieniał kodowania.

Tim Biegeleisen
źródło
0

Spróbuj tego: „KOPIUJ produkty_273 Z '\ tmp \ products_199.csv„ DELIMITER ”,„ CSV HEADER ”

Mohit Singh
źródło