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

418

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

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

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
источник
Вы используете postgres> = 8.1?
Дана Нормальная
1
Я думаю, что составлю план по переходу на более новую версию, которая сделает жизнь намного проще
Элитмиар
1
См. Также stackoverflow.com/q/1517635/287948
Питер Краусс

Ответы:

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"
jordg
источник
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);
maytham-ɯɐɥʇʎɐɯ
источник
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 ',');"
Atihska
источник
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;

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

user3767321
источник
0

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

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

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

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

Тим Бигелейзен
источник
0

Попробуйте это: "COPY products_273 FROM '\ tmp \ products_199.csv' РАЗДЕЛИТЕЛЬ ',' CSV HEADER"

Мохит Сингх
источник