web-dev-qa-db-fra.com

Comment imprimer le résultat d'une requête PostgreSQL au format CSV ou TSV à partir de la ligne de commande?

Je voudrais exécuter une requête à partir du shell (pas dans le client psql interactif) et lui faire imprimer la représentation CSV ou TSV de la sortie vers STDOUT. Comment faites-vous cela avec psql ou l'un des outils de ligne de commande PostgreSQL?

56
dan

Si vous utilisez PostgreSQL 8.2 ou plus récent, utilisez ceci pour CSV:

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

et celle de TSV, avec des NULLs appropriés:

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

Le formulaire CSV cite correctement tous les champs contenant le caractère guillemet double. Consultez la documentation PostgreSQL de votre version spécifique pour plus de détails et d'options pour COPY.

91
Matthew Wood

À partir de la réponse de Bohemian, j'ai trouvé ces drapeaux utiles:

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
  • Mode de sortie non aligné: -A
  • Utilisez une virgule comme délimiteur de champ: -F,
  • Ne pas lire psqlrc: -X
  • Tuples uniquement (pas d'en-tête/pied de page): -t
  • Fichier contenant une requête SQL: -f
  • Fichier de sortie: -o
37
Jason McVetta

EDITED: Utilisation de -F

Utilisez des virgules via -F et utilisez le "mode de sortie de table non aligné" -A:

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

Pour spécifier un tsv utilisez le délimiteur '\ t'

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

Pour spécifier un csv utilisez le délimiteur ','

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

La commande copy qui vous permet de spécifier l'en-tête, les délimiteurs et les options de devis est également possible.

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"
4
Gavin

Vous pouvez spécifier le séparateur de champ avec le paramètre de ligne de commande -F sur psql

3
Szocske

Exporter en TSV AVEC EN-TÊTE

Vous pouvez inclure l'en-tête comme suit:

\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;

Par exemple. (PSQL):

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

FRAPPER:

[victoria@victoria tsv]$ pwd
/mnt/Vancouver/programming/data/metabolism/tsv

[victoria@victoria 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
[victoria@victoria csv]$ 
0
Victoria Stuart