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',';

Czy używasz postgres> = 8.1?
Dana the Sane

1
Myślę, że zaplanuję aktualizację do nowszej wersji, znacznie ułatwi życie
Elitmiar

Odpowiedzi:


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

zgodnie z opisem w instrukcji .


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.


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;

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

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"

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);

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 ',');"

4

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

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

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.


0

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

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


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.


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.