112 votes

Comment masquer la décoration du jeu de résultats dans la sortie Psql

Comment masquer les noms de colonnes et le nombre de lignes dans la sortie de psql ?

Je lance une requête SQL via psql avec :

psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"

et je m'attends à une sortie comme :

1,abc
2,def
3,xyz

mais au lieu de cela, j'obtiens :

id,text
-------
1,abc
2,def
3,xyz
(3 lignes)

Évidemment, il n'est pas impossible de filtrer les deux premières lignes et la dernière ligne après coup, mais existe-t-il un moyen de le faire uniquement avec psql ? En lisant la manpage, je vois des options pour contrôler le délimiteur de champ, mais rien pour masquer la sortie superflue.

149voto

ruakh Points 68789

Vous pouvez utiliser l'option -t ou --tuples-only :

psql --user=myuser -d mydb --output=result.txt -t -c "SELECT \* FROM mytable;"

Modifié (plus d'un an plus tard) pour ajouter:

Vous pouvez également consulter la commande COPY. Je n'ai plus aucune instance de PostgreSQL à portée de main pour tester, mais je pense que vous pouvez écrire quelque chose du genre :

psql --user=myuser -d mydb -c "COPY mytable TO 'result.txt' DELIMITER ','"

(à l'exception que result.txt devra être un chemin absolu). La commande COPY prend également en charge un format CSV plus intelligent ; voir sa documentation.

33voto

Phil Points 164

Vous pouvez également rediriger la sortie depuis psql et utiliser la même option. Utilisez \o pour définir le fichier de sortie et \t pour afficher uniquement les tuples (ou \pset pour désactiver juste le "footer" rowcount).

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o

Alternativement,

\o /home/flynn/queryout.txt
\pset footer off
. . .

9voto

YordanGeorgiev Points 1222

Habituellement lorsque vous voulez analyser la sortie générée par psql vous voudriez définir les options -A et -F ...

    # générer t.col1, t.col2, t.col3 ...
    while read -r c; do test -z "$c" || echo  , $table_name.$c  | \
       perl -ne 's/\n//gm;print' ; \
       done < <(cat << EOF | PGPASSWORD=${postgres_db_useradmin_pw:-} \
       psql -A -F  -v -q -t -X -w -U \
       ${postgres_db_useradmin:-} --port $postgres_db_port --host $postgres_db_host -d \
       $postgres_db_name -v table_name=${table_name:-}
    SELECT column_name
    FROM information_schema.columns
    WHERE 1=1
    AND table_schema = 'public'
    AND table_name   =:'table_name'  ;
    EOF
    )
    echo -e "\n\n"

Vous pouvez trouver un exemple de l'appel bash complet ici:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X