Експорт віддаленої таблиці Postgres у файл CSV на локальній машині


16

Я маю доступ лише до читання до бази даних на віддаленому сервері. Отже, я можу виконати:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Але на цьому сервері у мене немає дозволів на створення / збереження файлу, тому мені потрібно це зробити на своїй локальній машині.

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

Або як я можу виконати команду Linux для підключення до віддаленої бази даних, виконання запиту та збереження результатів у вигляді файлу на своїй локальній машині?

Відповіді:


29

Обидва запропоновані підходи видаються надмірно складними.

Просто використовуйте psqlвбудовану \copyкоманду, яка працює так само, як на стороні сервера, COPYале робить копію через провідний протокол до клієнта та використовує клієнтські шляхи.

Оскільки psqlкомандою зворотної косої риски ви опускаєте крапку з комою, наприклад:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Див на \copyзапис в керівництво для psqlкоманди і COPYкоманди documenation для більш докладно.

Так само , як COPYви можете використовувати \copyз (SELECT ...)запитом замість імені таблиці при копіюванні даних з (але не в).


Загалом неповноцінною альтернативою, яка може бути корисною в кількох обмежених ситуаціях, є використання:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

і використовуйте -oпрапор або перенаправлення виводу оболонки, щоб записати вихід у файл. Ви майже завжди повинні використовувати \copyперевагу перед цим.


Але це не дозволяє здійснювати транзакції :(
Reza S

Гм, звичайно, це так. Використовуйте тут документ для подачі psqlсценарію, починаючи з BEGIN, потім виконуючи свої \copyкоманди, потім a COMMIT. Або використовувати psql -fдля запуску сценарію, а не використання тут документа.
Крейг Рінгер

Дякую, що повернувся ... ось що я закінчила, і це спрацювало =)
Reza S

Ви можете використовувати -Aзамість, -P format=unalignedа також я думаю, що вам потрібно-P fieldsep=,
Еван Керролл

2

Команда Linux:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
Це не призведе до створення CSV, воно створить форматований текст. Якщо ви додали -t -P format=unaligned до цієї команди, ви отримаєте щось трохи ближче, як, наприклад, CSV з обмеженою трубкою, але труби в тексті не уникнуть, тому це буде недійсним.
Крейг Рінгер

О, ви б також хотіли, -P fieldsep=','окрім того, що це навіть більше шансів на помилки через відсутність втечі. -P fieldsep_zero=onбуло б добре, якби ви не заперечували розбір тексту з обмеженим байтом, так як нульові байти не можуть виникати в psqlрезультаті виведення.
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.