web-dev-qa-db-fra.com

Comment exporter une sortie de requête PostgreSQL dans un fichier csv

J'ai des problèmes pour exporter ma sortie PostgreSQL depuis un shell vers un fichier csv.
Mon script SQL s'appelle script.sql.

J'ai tapé la commande suivante dans mon shell: 

psql congress -af script.sql &> filename.csv

Mais lorsque j'ai ouvert le fichier filename.csv, les valeurs de toutes les colonnes sont regroupées dans une colonne du fichier Excel CSV (voir la capture d'écran ci-jointe).

Puis j'ai essayé d'une autre manière. J'ai édité mon script.sql pour être:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

Ensuite, j'ai tapé la commande suivante dans le shell de la base de données dbname.

\i script.sql

La sortie est:

COPY 162

Eh bien, ma requête de sortie a 162 lignes. 

Les 162 lignes de ma table de sortie ont donc été copiées dans le shell. Comment puis-je les coller ou les déplacer dans un fichier csv? 

Ou, si je veux utiliser le fichier nomfichier.csv (capture d'écran jointe), comment puis-je corriger le format de ce fichier csv/Excel? 

Screenshot of filename.csv

13
mflowww

Syntaxe moderne:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

Les 162 lignes de ma table de sortie ont donc été copiées dans le shell. Comment puis-je les coller ou les déplacer dans un fichier csv?

Le résultat est le fichier CSV. Ouvrez-le avec n’importe quel tableur utilisant des délimiteurs correspondants. Par documentation:

La valeur par défaut est un caractère de tabulation au format texte, une virgule au format CSV

Comme commenté Patrick , vous pouvez utiliser la méta-commande psql correspondante \copy de la même manière. Il écrit (et lit) les fichiers locaux sur le client et ne nécessite pas de privilèges de superutilisateur.

Plus d'explications dans ces réponses connexes:

30
Erwin Brandstetter

copiez d’abord vos informations de connexion dans ~/.pgpass et 

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
0
Ash

En partant un peu tangente, il existe aussi un autre moyen. 

J'utilise les éléments suivants dans un script batch Windows: -

psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

L'astuce consiste à retenir l'option -A. Il supprime les espaces de remplissage des données.

Je le fais pour éviter les erreurs d’autorisation de la commande COPY indiquée ci-dessus. Le compte qui exécute postgress n’a pas les mêmes autorisations que le compte qui exécute mon fichier de commandes planifié.

Cela me donne une liste de tables dans un schéma donné avec des résultats comme: -

myschema | mytable1

myschema | mytable2

J'utilise ensuite la commande FOR batch pour traiter chaque ligne. Si vous voulez VRAIMENT un fichier CSV, tout ce que vous devez faire est le suivant: -

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

Probablement pas le plus efficace des mécanismes, mais fonctionne très bien sur un petit nombre de lignes de sortie.

0
Darren Gill