Как вы печатаете результат запроса PostgreSQL в формате CSV или TSV из командной строки?

Я хотел бы выполнить запрос из оболочки (не в интерактивном psql-клиенте) и распечатать CSV или TSV-представление вывода в STDOUT. Как вы это делаете с помощью psql или одного из инструментов командной строки PostgreSQL?

Ответ 1

Если вы используете PostgreSQL 8.2 или новее, используйте это для CSV:

psql -c "COPY (<select query>) TO STDOUT WITH CSV"

и это TSV с соответствующими NULL:

psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''"

Форма CSV правильно укажет любые поля, содержащие символ двойной кавычки. Дополнительную информацию и опции для COPY можно найти в документации PostgreSQL к вашей конкретной версии.

Ответ 2

Начиная с богемского ответа, я нашел эти флаги полезными:

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
  • Невыраженный режим вывода: -A
  • Используйте запятую как разделитель полей: -F,
  • Не читайте psqlrc: -X
  • Только кортежи (без верхнего/нижнего колонтитула): -t
  • Файл, содержащий SQL-запрос: -f
  • Выходной файл: -o

Ответ 3

EDITED: использование -F

Используйте запятые через -F и используйте "режим вывода без знака таблицы" -A:

psql my_database -U myuser -A -F , -c "select * from mytable"

Ответ 4

Чтобы указать tsv, используйте разделитель '\ t'

psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv

Чтобы указать csv, используйте разделитель ','

psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv

Ответ 5

Также возможна команда copy, которая позволяет указать заголовки, разделители и варианты кавычек

psql my_database -U my_user -c "copy (select a.id,b.id from my_table_a as a inner join my_table_b as b on b.id = a.id) to STDOUT"

Ответ 6

Вы можете указать разделитель полей с параметром командной строки -F в psql

Ответ 7

Экспорт как TSV с заголовком

Вы можете включить заголовок следующим образом:

\COPY (SELECT * FROM tca) TO '/.../metab/tca.tsv' WITH DELIMITER E'\t' CSV HEADER;

\COPY (SELECT * FROM tca) TO '/...a/metab/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;

Например, (PSQL):

[metabolism]# \COPY (SELECT * FROM tca) TO '/mnt/Vancouver/programming/data/metabolism/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;
COPY 22

BASH:

[[email protected] tsv]$ pwd
/mnt/Vancouver/programming/data/metabolism/tsv

[[email protected] tsv]$ head -n3 tca.tsv
uuid    src tgt rel rel_type
878b87de-0ca8-49a8-9f77-a24353e251d2    oxalosuccinic acid  oxoglutaric acid    1.1.1.42    2
7fd9cf88-495b-491b-956e-294f19097923    isocitric acid  oxoglutaric acid    1.1.1.41    2
[[email protected] csv]$