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',';
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',';
Odpowiedzi:
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
zgodnie z opisem w instrukcji .
COPYwymaga uprawnień administratora. Użyj \COPYzamiast tego, jeśli napotkasz problemy.
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Z wiersza polecenia psql:
\COPY my_table TO 'filename' CSV HEADER
na końcu brak średnika.
COPYpolecenie wymaga dostępu administratora
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.
pg_dump -h remote | pg_restore -h localhost.
psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
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;
\COPY ...). I przynajmniej w mojej wersji psql (9.5.2) nie musiałem podawać „DELIMITER”; domyślnie był to przecinek.
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
To działa
psql dbname -F , --no-align -c "SELECT * FROM TABLE"
-F ,i używam |jako separatora. Dzięki!
COPYoświadczenie, które tworzy plik do ponownego użycia
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);
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.
skopiuj (anysql query datawanttoexport) do 'fileablsoutepathwihname' delimiter ',' nagłówek csv;
Za pomocą tego możesz również eksportować dane.
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.
Spróbuj tego: „KOPIUJ produkty_273 Z '\ tmp \ products_199.csv„ DELIMITER ”,„ CSV HEADER ”