Кейсы

PostgreSQL: выгрузить таблицу в CSV через psql

Выгрузить таблицу PostgreSQL в CSV из psql можно двумя командами. Серверный COPY ... TO пишет файл на диск машины, где крутится Postgres. Клиентский \copy пишет файл туда, откуда вы запустили psql. Ниже — оба варианта, тем же разделителем, которым я пользовался.

COPY — файл на сервере

COPY (SELECT * FROM tablename) TO '/tmp/test.csv' WITH CSV DELIMITER ';' HEADER;

Так я и делал. COPY ... TO файл — это SQL. Файл появляется на сервере PostgreSQL, путь должен быть доступен пользователю, под которым запущен процесс postgres. Обычно нужны права суперпользователя. Домашний каталог на ноутбуке сюда не подойдёт.

\copy — файл у себя

\copy (SELECT * FROM tablename) TO 'test.csv' WITH CSV DELIMITER ';' HEADER

\copy — команда psql. Файл создаётся на клиенте. Для выгрузки на свой компьютер это обычный путь: не нужно открывать каталоги серверу и не нужно быть суперпользователем.

Что ещё помнить

  • HEADER добавляет строку с именами колонок.
  • DELIMITER ';' удобнее для Excel в русской локали, чем запятая.
  • Большую выборку лучше ограничивать в подзапросе.
  • Если в CSV кракозябры, задайте ENCODING 'UTF8'.

Смежные заметки: зависшие запросы, хаб PostgreSQL. Про выгрузки на десятки миллионов строк — в разборе 142 млн объявлений.