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

284

J'utilise psql \dtpour répertorier toutes les tables d'une base de données et j'ai besoin d'enregistrer les résultats.

Quelle est la syntaxe pour exporter les résultats d'une commande psql dans un fichier?

pstanton
la source
1
Voir aussi stackoverflow.com/questions/3939329/… .
Matt Solnit

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
jhwist
la source
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

intgr
la source
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;
Aakash Gupta
la source
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
Yavuz
la source
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

Stephen
la source
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

Daniil Mashkin
la source
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.

Er.Ankit H Gandhi
la source
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.

hlovdal
la source
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

Eduardo Lucio
la source
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
Roman Rhrn Nesterov
la source