psql - sauvegarde les résultats de la commande dans un fichier


Réponses:


479

De l'aide de psql ( \?):

\ o [FILE] envoie tous les résultats de la requête au fichier ou au | pipe

La séquence de commandes ressemblera à ceci:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
dois-je appeler cela avant le \ dt, ou en combinaison? veuillez inclure la syntaxe merci.
pstanton

118
Taper à \onouveau le désactive.
Carl G

3
Malheureusement, la sortie de \?ne va pas dans le fichier. :(
blitzen9872

pour votre aimable autorisation personnelle refusée dit d'essayer d'exécuter psql en tant qu'administrateur
Ajay Takur

1
Oui, \o queries-output.txtredirige toutes les commandes suivantes o / p vers le fichier nommé queries-output.txtet la frappe \o(à l' invite psql à nouveau) annule ce comportement de redirection.
hygull

95

La \ocommande psql a déjà été décrite par jhwist.

Une autre approche consiste à utiliser la COPY TOcommande pour écrire directement dans un fichier sur le serveur. Cela a l'avantage d'être sauvegardé dans un format facile à analyser de votre choix - plutôt que dans le format tabulé de psql. Il est également très facile d'importer vers une autre table / base de données en utilisant COPY FROM.

NB! Cela nécessite des privilèges de superutilisateur et écrit dans un fichier sur le serveur .

Exemple: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

Crée un fichier CSV avec ';' comme séparateur de champ.

Comme toujours, consultez la documentation pour plus de détails


Je suis d'accord @helvete, l'approche présentée ici fournit plus de puissance à l'utilisateur pour configurer la sortie d'une manière plus personnalisée
Nathan Benton

27

\copyqui est une commande postgres peut fonctionner pour n'importe quel utilisateur. Je ne sais pas si cela fonctionne pour \ dt ou non, mais la syntaxe générale est reproduite à partir du lien suivant Syntaxe de copie SQL Postgres

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

Ce qui précède enregistrera la sortie de la requête de sélection dans le nom de fichier fourni en tant que fichier csv

ÉDITER:

Pour mon serveur psql, la commande suivante fonctionne, il s'agit d'une ancienne version v8.5

copy (select * from table1) to 'full_path_filename' csv header;

Très pratique, merci. Mais la «copie» dans «... copier vers ...» n'est pas requise - en fait, sur les versions récentes, la commande échoue.
Tom

Tom, je pense que c'était une faute de frappe. Modifié le message avec celui qui fonctionne sur mon installation pgsql 8.5ver
Aakash Gupta

Juste une petite note pour quiconque essaie de coller une instruction sur plusieurs lignes après \ copy et obtient des erreurs de syntaxe déroutantes, comme je viens de le faire. Vous devez continuer sur la même ligne que \ copy.
demandé

Existe-t-il un moyen de désactiver la \ copie? J'ai constaté que si j'exécute une instruction comme dans votre exemple, puis que je lance, par exemple, sélectionnez * parmi les utilisateurs; qu'il ajoutera les résultats au fichier le plus récent que j'ai spécifié au lieu de les afficher à l'écran. Je vous remercie.
raphael75

6

Utilisez le paramètre o de la commande pgsql.

-o, --output = FILENAME envoie les résultats de la requête au fichier (ou | pipe)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; cette commande est utilisée pour stocker la table entière en tant que csv


Dans postgres, COPY est mieux remplacé par \ COPY pour éviter d'avoir besoin d'administrateur db. Dans les fenêtres ce qui met le fichier dans C: \ tmp
Jan

3

Si vous obtenez l'erreur suivante ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

vous pouvez l'exécuter de cette façon:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv


2

Utilisez la requête ci-dessous pour stocker le résultat dans un fichier csv

\ copier (votre requête) dans l'en-tête csv du 'chemin du fichier';

Exemple

\ copy (sélectionnez le nom, date_order de Purchase_order) dans l'en-tête cvs «/home/ankit/Desktop/result.csv»;

J'espère que cela vous aidera.


1

Je suppose qu'il existe une commande psql interne pour cela, mais vous pouvez également exécuter la scriptcommande à partir du package util-linux-ng :

DESCRIPTION Le script crée un script de tout ce qui est imprimé sur votre terminal.


0

Cette approche fonctionnera avec n'importe quelle commande psql, de la plus simple à la plus complexe, sans nécessiter aucune modification ou ajustement de la commande d'origine.

REMARQUE: pour les serveurs Linux.


  • Enregistrez le contenu de votre commande dans un fichier

MODÈLE

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

EXEMPLE

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • Exécutez la commande

MODÈLE

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

EXEMPLE

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Afficher / suivre la sortie de votre commande

cat sqlop

Terminé! Merci! = D


0

Approche pour docker

via la commande psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

ou requête à partir du fichier sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.