Экспорт удаленной таблицы Postgres в CSV-файл на локальном компьютере

15

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

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

Но на этом сервере у меня нет прав на создание / сохранение файла, поэтому мне нужно сделать это на моей локальной машине.

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

Или как выполнить команду Linux для подключения к удаленной базе данных, выполнить запрос и сохранить выходные данные в виде файла на моем локальном компьютере?

tasmaniski
источник

Ответы:

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;'
tasmaniski
источник
1
Это не произведет CSV, это произведет форматированный текстовый вывод. Если вы добавите -t -P format=unaligned к этой команде, вы получите что-то более близкое, например, глючный CSV с разделителями каналов, но каналы в тексте не будут экранированы, поэтому они будут недействительными.
Крейг Рингер
О, вы также хотели бы, -P fieldsep=','за исключением того, что это может привести к ошибкам из-за отсутствия выхода. -P fieldsep_zero=onбыло бы хорошо, если бы вы не возражали против синтаксического анализа текста, разделенного нулем, поскольку нулевые байты не могут возникать psqlестественным образом.
Крейг Рингер