Как экспортировать таблицу в формате CSV с заголовками на Postgresql?


418

Я пытаюсь экспортировать таблицу PostgreSQL с заголовками в файл CSV через командную строку, однако я получаю ее для экспорта в файл CSV, но без заголовков.

Мой код выглядит следующим образом:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

Вы используете postgres> = 8.1?
Дана Нормальная

1
Я думаю, что составлю план по переходу на более новую версию, которая сделает жизнь намного проще
Элитмиар

Ответы:


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

как описано в руководстве .


7
Имейте в виду, что аргумент HEADER не был введен до 8.1.
Дана Нормальная

7
Который, скажем, немного ржавый.
Милен А. Радев

65
Примечание COPYтребует прав администратора. Используйте \COPYвместо этого, если вы столкнетесь с проблемами.
августа

5
это может дать вам несовместимый вывод, лучше использовать «FORMAT csv», чем «DELIMITER», «». не уверен, что версия, которая прибыла, хотя
grahamrhay

37
Для v9.5 команда теперьCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal

223

Из командной строки psql:

\COPY my_table TO 'filename' CSV HEADER

нет точки с запятой в конце.


22
эта версия, безусловно, лучшая, так как COPYкоманда требует административного доступа
Мэтью О'Риордан

2
Также при таком psqlподходе можно сохранять результаты в любом месте, к которому у них есть доступ. Я просто использовал psqlподход, чтобы получить данные с удаленного сервера в локальный файл. Очень гладко
Ян Гоу

Намного лучше, особенно при сохранении в каталог, к которому у вас есть доступ, но у пользователя postgres нет.
Стив Беннетт

2
@arilwan Используйте pg_dump -h remote | pg_restore -h localhost.
Ян Гоу,

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Юха Паломяки

122

вместо простого имени таблицы вы также можете написать запрос для получения только данных выбранного столбца.

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

с правами администратора

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

Я не верю, что вам нужна завершающая точка с запятой в psql-версии команды ( \COPY ...). И, по крайней мере, в моей версии psql (9.5.2) мне не нужно было указывать «DELIMITER»; по умолчанию была запятая.
user1071847

как изменить синтаксис, если я
копирую

99

Когда у меня нет разрешения на запись файла из Postgres, я обнаруживаю, что могу выполнить запрос из командной строки.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
Лучшее для "любой среды". Лучше всего для 1. Не нужны специальные разрешения в Postgresql или на клиенте; 2. можете использовать относительный путь; и 3. безопасен для реального формата CSV (безопасные цитаты).
Питер Краусс

34

Это работает

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
Ницца. Обратите внимание, что это, кажется, не экранирует запятые внутри полей, которые их содержат.
RecursivelyIronic

Мне нравится это, без -F ,, и использовать |в качестве разделителя. Спасибо!
dsummersl

2
Это не то, что обычно считается функцией экспорта, это просто контролируемое отображение данных. Разница невелика, но важна: это больше предназначено для чтения человеком, чем COPYутверждение, которое создает файл для повторного использования
Romain G

7
ОПАСНО: оно не для формата CSV, не работает для массивов или текста с "," .. не выполняет правильную CSV-цитату. Используйте ответ @ Brian.
Питер Краусс

8

Для версии 9.5, которую я использую, это было бы так:

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

7

Это решение работало для меня, используя \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

Самый простой способ (использование psql) - использование --csvфлага:

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

Это работает только в PostgreSQL версии 12+
Dirk

3

Вот как у меня получилась рабочая оболочка power используя pgsl connnect для базы данных Heroku PG:

Сначала мне пришлось изменить кодировку клиента на utf8 следующим образом: \encoding UTF8

Затем выгрузил данные в файл CSV:

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

Я использовал ~ в качестве разделителя, потому что мне не нравятся файлы CSV, я обычно использую файлы TSV, но он не позволяет мне добавлять '\ t' в качестве разделителя, поэтому я использовал ~, потому что это редко используемый символ.


0

скопировать (запрос данных любого запроса на экспорт) в 'fileablsoutepathwihname' delimiter ',' csv header;

Используя это вы также можете экспортировать данные.


0

Я публикую этот ответ, потому что ни один из приведенных здесь ответов на самом деле не работал для меня. Я не мог использовать COPYизнутри Postgres, потому что у меня не было правильных разрешений. Поэтому я выбрал «Экспорт строк сетки» и сохранил вывод как UTF-8.

psqlВерсия дается также @ Брайан не работал для меня, по другой причине. Причина, по которой это не сработало, заключается в том, что, очевидно, командная строка Windows (я использовал Windows) сама вмешивалась в кодировку. Я продолжал получать эту ошибку:

ОШИБКА: символ с байтовой последовательностью 0x81 в кодировке "WIN1252" не имеет эквивалента в кодировке "UTF8"

В итоге я решил написать короткий JDBC-скрипт (Java), который считывал файл CSV и выдавал операторы вставки прямо в мою таблицу Postgres. Это работало, но командная строка также работала бы, если бы она не изменяла кодировку.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.