Какой самый простой способ сохранить вывод PL / pgSQL из базы данных PostgreSQL в файл CSV?
Я использую PostgreSQL 8.4 с плагином pgAdmin III и PSQL, откуда я запускаю запросы.
Какой самый простой способ сохранить вывод PL / pgSQL из базы данных PostgreSQL в файл CSV?
Я использую PostgreSQL 8.4 с плагином pgAdmin III и PSQL, откуда я запускаю запросы.
Ответы:
Вам нужен полученный файл на сервере или на клиенте?
Серверная сторона
Если вы хотите что-то простое для повторного использования или автоматизации, вы можете использовать встроенную в Postgresql команду COPY . например
Этот подход полностью работает на удаленном сервере - он не может записывать на локальный компьютер. Он также должен быть запущен как «суперпользователь» Postgres (обычно называемый «root»), потому что Postgres не может остановить его, делая неприятные вещи с локальной файловой системой этого компьютера.
Это на самом деле не означает , что вы должны быть подключены как суперпользователь (автоматизации , что будет представлять угрозу безопасности другого рода), потому что вы можете использовать в
SECURITY DEFINER
возможностьCREATE FUNCTION
сделать функцию , которая работает , как если бы вы были суперпользователя .Важнейшей частью является то, что ваша функция предназначена для выполнения дополнительных проверок, а не просто для обхода защиты, - поэтому вы можете написать функцию, которая экспортирует точные данные, которые вам нужны, или вы можете написать что-то, что может принимать различные параметры, если они встретить строгий белый список. Вам нужно проверить две вещи:
GRANT
s в базе данных, но теперь функция работает как суперпользователь, поэтому таблицы, которые обычно бывают «вне границ», будут полностью доступны. Вы, вероятно, не хотите, чтобы кто-то вызывал вашу функцию и добавлял строки в конец вашей таблицы «users» ...Я написал сообщение в блоге, расширяющее этот подход , включая некоторые примеры функций, которые экспортируют (или импортируют) файлы и таблицы, отвечающие строгим условиям.
Сторона клиента
Другой подход заключается в обработке файлов на стороне клиента , т.е. в вашем приложении или скрипте. Серверу Postgres не нужно знать, в какой файл вы копируете, он просто выплевывает данные, а клиент помещает их куда-то.
Основным синтаксисом для этого является
COPY TO STDOUT
команда, и графические инструменты, такие как pgAdmin, обернут ее для вас в приятный диалог.У
psql
клиента командной строки есть специальная «мета-команда»\copy
, которая принимает те же параметры, что и «настоящая»COPY
, но запускается внутри клиента:Обратите внимание, что здесь нет завершения
;
, потому что метакоманды завершаются переводом строки, в отличие от команд SQL.Из документов :
Ваш язык прикладного программирования также может иметь поддержку для извлечения или извлечения данных, но вы обычно не можете использовать
COPY FROM STDIN
/ вTO STDOUT
пределах стандартного оператора SQL, потому что нет способа соединить поток ввода-вывода. PHP-обработчик PostgreSQL ( не PDO) включает в себя базовые функцииpg_copy_from
иpg_copy_to
функции, которые копируют в / из массива PHP, что может быть неэффективно для больших наборов данных.источник
\copy
тоже работает - там, пути относительно клиента, и точка с запятой не нужна / не разрешена. Смотрите мое редактирование.\copy
должен быть один вкладыш. Таким образом, вы не получаете красоту форматирования SQL, как вы хотите, и просто поместив копию / функцию вокруг него.\copy
это специальная мета-команда вpsql
клиенте командной строки . Это не будет работать в других клиентах, таких как pgAdmin; у них, вероятно, будут свои собственные инструменты, такие как графические мастера, для выполнения этой работы.Есть несколько решений:
1
psql
командаpsql -d dbname -t -A -F"," -c "select * from users" > output.csv
Это имеет большое преимущество в том, что вы можете использовать его через SSH, например,
ssh postgres@host command
- позволяя вам получить2
copy
команды postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql интерактивный (или нет)
Все они могут быть использованы в сценариях, но я предпочитаю # 1.
4 пгадмина но это не в сценарии.
источник
В терминале (при подключении к БД) установите вывод в файл cvs
1) Установите разделитель полей на
','
:2) Установите формат вывода без выравнивания:
3) Показывать только кортежи:
4) Установите выход:
5) Выполните ваш запрос:
6) Выход:
После этого вы сможете найти свой CSV-файл в этом месте:
Скопируйте его с помощью
scp
команды или отредактируйте с помощью nano:источник
COPY
Или\copy
приближается ручку правильно (конвертировать в стандартный формат CSV); Является ли это?Если вас интересуют все столбцы определенной таблицы вместе с заголовками, вы можете использовать
Это немного проще, чем
которые, насколько мне известно, эквивалентны.
источник
CSV Экспорт унификации
Эта информация не очень хорошо представлена. Поскольку это второй раз, когда мне нужно было получить это, я помещу это здесь, чтобы напомнить себе, если ничего больше.
Действительно лучший способ сделать это (вытащить CSV из postgres) - это использовать
COPY ... TO STDOUT
команду. Хотя вы не хотите делать это так, как показано в ответах здесь. Правильный способ использования команды:Запомните только одну команду!
Отлично подходит для использования поверх ssh:
Он отлично подходит для использования в докере по ssh:
Это даже здорово на локальной машине:
Или внутри докера на локальной машине?
Или в кластере kubernetes, в докере, через HTTPS ??
Так универсально, много запятых!
Ты когда-нибудь?
Да, вот мои заметки:
КОПЫ
Использование
/copy
эффективно выполняет файловые операции в любой системе, вpsql
которой выполняется команда, как пользователь, выполняющий ее 1 . Если вы подключаетесь к удаленному серверу, просто скопировать файлы данных в системе, выполняющейсяpsql
на / с удаленного сервера.COPY
выполняет файловые операции на сервере в качестве учетной записи пользователя внутреннего процесса (по умолчаниюpostgres
), пути к файлам и разрешения проверяются и применяются соответственно. При использованииTO STDOUT
проверки прав доступа к файлам обходятся.Обе эти опции требуют последующего перемещения файла, если
psql
он не выполняется в системе, где вы хотите, чтобы результирующий CSV в конечном итоге находился. По моему опыту, это наиболее вероятный случай, когда вы в основном работаете с удаленными серверами.Сложнее настроить что-то вроде туннеля TCP / IP через ssh на удаленную систему для простого вывода CSV, но для других форматов вывода (двоичного) может быть лучше
/copy
использовать туннельное соединение с локальным выполнениемpsql
. Аналогичным образом, для больших импортов перемещение исходного файла на сервер и использованиеCOPY
, вероятно, является наиболее эффективным вариантом.Параметры PSQL
С параметрами psql вы можете отформатировать вывод как CSV, но есть и недостатки, такие как необходимость помнить, чтобы отключить пейджер и не получать заголовки:
Другие инструменты
Нет, я просто хочу получить CSV с моего сервера без компиляции и / или установки инструмента.
источник
Мне пришлось использовать \ COPY, потому что я получил сообщение об ошибке:
Поэтому я использовал:
и это функционирует
источник
psql
можем сделать это для вас:См.
man psql
Для справки об опциях, используемых здесь.источник
Новая версия - PSQL 12 - будет поддерживать
--csv
.Применение:
источник
Я работаю над AWS Redshift, который не поддерживает эту
COPY TO
функцию.Мой инструмент BI поддерживает CSV с разделителями табуляции, поэтому я использовал следующее:
источник
В pgAdmin III есть возможность экспортировать в файл из окна запроса. В главном меню это Query -> Execute to file или есть кнопка, которая делает то же самое (это зеленый треугольник с синим гибким диском в отличие от простого зеленого треугольника, который просто выполняет запрос). Если вы не запускаете запрос из окна запроса, я бы сделал то, что предложил IMSoP, и использовал бы команду копирования.
источник
Я попробовал несколько вещей, но немногие из них смогли дать мне желаемый CSV с подробностями заголовка.
Вот что сработало для меня.
источник
Я написал небольшой инструмент под названием,
psql2csv
который инкапсулируетCOPY query TO STDOUT
шаблон, что приводит к правильному CSV. Это интерфейс похож наpsql
.Предполагается, что запрос представляет собой содержимое STDIN, если оно есть, или последний аргумент. Все остальные аргументы перенаправляются в psql, кроме следующих:
источник
Если у вас более длинный запрос, и вы хотите использовать psql, поместите запрос в файл и используйте следующую команду:
источник
-F","
вместо того,-F";"
чтобы генерировать файл CSV, который будет правильно открываться в MS ExcelЧтобы загрузить CSV-файл с именами столбцов в качестве HEADER, используйте следующую команду:
источник
Я очень рекомендую DataGrip , IDE для базы данных JetBrains. Вы можете экспортировать запрос SQL в файл CSV и с легкостью настроить ssh-туннелирование. Когда документация ссылается на «набор результатов», они означают результат, возвращаемый SQL-запросом в консоли.
Я не связан с DataGrip, я просто люблю продукт!
источник
JackDB , клиент базы данных в вашем веб-браузере, делает это действительно легко. Особенно если ты на Heroku.
Это позволяет вам подключаться к удаленным базам данных и выполнять SQL-запросы к ним.
Источник (источник: jackdb.com )
Как только ваша БД подключена, вы можете запустить запрос и экспортировать в CSV или TXT (см. Справа внизу).
Примечание: я никоим образом не связан с JackDB. В настоящее время я пользуюсь их бесплатными услугами и считаю, что это отличный продукт.
источник
По запросу @ skeller88 я публикую свой комментарий в качестве ответа, чтобы его не потеряли люди, которые не читают каждый ответ ...
Проблема с DataGrip заключается в том, что он надежно удерживает ваш кошелек. Это не бесплатно. Попробуйте версию сообщества DBeaver на dbeaver.io. Это многоплатформенный инструмент для баз данных FOSS для программистов SQL, администраторов баз данных и аналитиков, который поддерживает все популярные базы данных: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto и т. Д.
DBeaver Community Edition позволяет легко подключиться к базе данных, выполнить запросы для извлечения данных, а затем загрузить набор результатов, чтобы сохранить его в CSV, JSON, SQL или других распространенных форматах данных. Это жизнеспособный конкурент FOSS для TOAD для Postgres, TOAD для SQL Server или Toad для Oracle.
Я не имею никакого отношения к DBeaver. Мне нравится цена и функциональность, но я бы хотел, чтобы они больше открывали приложение DBeaver / Eclipse и позволяли легко добавлять аналитические виджеты в DBeaver / Eclipse, а не требовать от пользователей платить за годовую подписку для создания графиков и диаграмм непосредственно внутри приложение. Мои навыки Java-кодирования устарели, и я не хочу потратить недели на то, чтобы заново научиться создавать виджеты Eclipse, но обнаружил, что DBeaver отключил возможность добавления сторонних виджетов в DBeaver Community Edition.
Имеют ли пользователи DBeaver представление о том, как создавать аналитические виджеты для добавления в Community Edition DBeaver?
источник
источник