web-dev-qa-db-fra.com

Exporter la table Postgres distante vers un fichier CSV sur une machine locale

J'ai un accès en lecture seule à une base de données sur un serveur distant. Je peux donc exécuter:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Mais sur ce serveur, je n'ai pas les autorisations pour créer/enregistrer un fichier, donc je dois le faire sur ma machine locale.

Lorsque je me connecte à la base de données distante, comment puis-je exécuter une commande pour enregistrer le fichier sur ma machine locale au lieu du serveur distant?

Ou, comment puis-je exécuter une commande Linux pour se connecter à la base de données distante, exécuter une requête et enregistrer la sortie sous forme de fichier sur ma machine locale?

18
tasmaniski

Les deux approches déjà suggérées semblent être inutilement compliquées.

Utilisez simplement le psql intégré de \copy commande, qui fonctionne exactement comme côté serveur COPY mais effectue une copie via le protocole de connexion au client et utilise les chemins d'accès client.

Parce que c'est une commande psql barre oblique inverse, vous omettez le point-virgule de fin, par exemple:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Voir le \copy entrée dans le manuel pour la commande psql et la documentation COPY command pour plus de détails.

Tout comme COPY, vous pouvez utiliser \copy avec un (SELECT ...) requête au lieu d'un nom de table lors de la copie des données (mais pas dans).


Une alternative généralement inférieure qui peut être utile dans quelques situations limitées est d'utiliser:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

et utilisez le -o drapeau ou redirection de sortie Shell pour écrire la sortie dans un fichier. Vous devriez presque toujours utiliser \copy de préférence à cela.

30
Craig Ringer

La commande Linux est:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
2
tasmaniski