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?
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.
La commande Linux est:
psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'