Як експортувати таблицю у форматі CSV із заголовками на Postgresql?


418

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

Мій код виглядає так:

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

Чи використовуєте ви postgres> = 8.1?
Dana Sane

1
Думаю, я складу план переходу на новішу версію, зробить життя набагато простішим
Elitmiar

Відповіді:


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

як описано в посібнику .


7
Майте на увазі, що аргумент HEADER був введений до 8.1.
Dana Sane

7
Що, скажімо, трохи іржаве.
Мілен А. Радев

65
Примітка COPYвимагає прав адміністратора. Використовуйте \COPYнатомість, якщо у вас виникли проблеми.
fny

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команда вимагає доступу адміністратора
Matthew O'Riordan

2
Також із psqlпідходом можна зберегти вихід у будь-якому місці, до якого є доступ. Я просто використовував psqlпідхід для отримання даних з віддаленого сервера в локальний файл. Дуже струнка.
Ian Gow

Набагато краще, особливо при збереженні в каталозі, до якого ви маєте доступ, але користувач postgres цього не робить.
Стів Беннетт

2
@arilwan Використання pg_dump -h remote | pg_restore -h localhost.
Ян Гоу

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki

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"; за замовчуванням була кома.
користувач1071847

як змінюється синтаксис, якщо я
копіюю

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
Приємно. Зауважте, що, схоже, це не виходить комами всередині полів, які містять їх.
РекурсивноІронічний

Мені подобається це, без -F ,і використовувати |як роздільник. Дякую!
dsummersl

2
Це не те, що зазвичай розглядають як функцію експорту, а лише кероване відображення даних. Різниця невелика, але важлива: це більше призначене для читання людиною, ніж COPYтвердження, яке створює файл для повторного використання
Ромен G

7
НЕБЕЗПЕЧНО це не для формату CSV, не працює для масивів чи тексту з "," .. не робити належних CSV-цитат. Використовуйте відповідь @ Брайана.
Пітер Краус


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+
Дірк

3

Ось як я отримав його робочу оболонку живлення, використовуючи підключення pgsl до бази даних Heroku PG:

Я повинен був спочатку змінити кодування клієнта на utf8, як це: \encoding UTF8

Потім скидайте дані у файл CSV:

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

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


0

скопіювати (anysql query datawanttoexport) на 'fileablsoutepathwihname' роздільник ',' заголовок csv;

Використовуючи це, ви також можете експортувати дані.


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.