Я хотел бы выполнить запрос из оболочки (не в интерактивном psql-клиенте) и распечатать CSV или TSV-представление вывода в STDOUT. Как вы это делаете с помощью psql
или одного из инструментов командной строки PostgreSQL?
Как вы печатаете результат запроса PostgreSQL в формате CSV или TSV из командной строки?
Ответ 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]$