CSV Экспорт унификации
Эта информация не очень хорошо представлена. Поскольку это второй раз, когда мне нужно было получить это, я помещу это здесь, чтобы напомнить себе, если ничего больше.
Действительно лучший способ сделать это (получить CSV из postgres) - использовать команду COPY ... TO STDOUT
. Хотя вы не хотите делать это так, как показано в ответах здесь. Правильный способ использования команды:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
Запомните только одну команду!
Отлично подходит для использования через ssh:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
Отлично подходит для использования в докере по ssh:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
Это даже здорово на локальной машине:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Или внутри докера на локальной машине?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Или в кластере kubernetes, в докере, через HTTPS ??:
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
Так универсально, много запятых!
Ты хоть?
Да, вот мои заметки:
КОПИЯ
Использование /copy
эффективно выполняет файловые операции в любой системе, в которой работает команда psql
, как пользователь, выполняющий ее 1 . Если вы подключаетесь к удаленному серверу, просто скопировать файлы данных в системе, выполнив psql
на / с удаленного сервера.
COPY
выполняет файловые операции на сервере в качестве учетной записи пользователя внутреннего процесса (по умолчанию postgres
), пути к файлам и разрешения проверяются и применяются соответствующим образом. При использовании TO STDOUT
проверки прав доступа к файлам обходятся.
Обе эти опции требуют последующего перемещения файла, если psql
не выполняется в системе, где вы хотите, чтобы результирующий CSV в конечном итоге находился. По моему опыту, это наиболее вероятный случай, когда вы в основном работаете с удаленными серверами.
Более сложно настроить что-то вроде туннеля TCP / IP через ssh на удаленную систему для простого вывода CSV, но для других форматов вывода (двоичного) может быть лучше /copy
через туннельное соединение, выполни местный psql
. Аналогичным образом, при большом импорте перемещение исходного файла на сервер и использование COPY
, вероятно, является наиболее эффективным вариантом.
Параметры PSQL
С параметрами psql вы можете отформатировать вывод как CSV, но есть и недостатки, такие как необходимость помнить о необходимости отключить пейджер и не получать заголовки:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
Другие инструменты
Нет, я просто хочу вывести CSV из моего сервера без компиляции и / или установки инструмента.