J'essaie d'exporter une table PostgreSQL avec des en-têtes dans un fichier CSV via une ligne de commande. Cependant, je l'utilise pour exporter dans un fichier CSV, mais sans en-têtes.
Mon code se présente comme suit:
COPY products_273 to '/tmp/products_199.csv' delimiters',';
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
comme décrit dans le manuel .
Depuis la ligne de commande psql:
\COPY my_table TO 'filename' CSV HEADER
pas de point-virgule à la fin.
au lieu d'un nom de table, vous pouvez également écrire une requête pour obtenir uniquement les données de colonne sélectionnées.
COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
avec privilège administrateur
\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Lorsque je ne suis pas autorisé à écrire un fichier à partir de Postgres, je constate que je peux exécuter la requête à partir de la ligne de commande.
psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Cela marche
psql dbname -F , --no-align -c "SELECT * FROM TABLE"
Pour la version 9.5 que j'utilise, ce serait comme ça:
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Cette solution a fonctionné pour moi avec \copy
.
psql -h <Host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
Voici comment je me suis débrouillé pour que Shell utilise pgsl connnect à une base de données Heroku PG:
Je devais d'abord changer le codage du client en utf8 comme ceci: \encoding UTF8
Puis jeté les données dans un fichier CSV ceci:
\copy (SELECT * FROM my_table) TO C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'
J'ai utilisé ~ comme délimiteur parce que je n'aime pas les fichiers CSV. J'utilise généralement des fichiers TSV, mais cela ne me permet pas d'ajouter "\ t" comme délimiteur. J'ai donc utilisé ~ car son un caractère rarement utilisé.
Je publie cette réponse car aucune des autres réponses données ici ne fonctionnait réellement pour moi. Je ne pouvais pas utiliser COPY
à partir de Postgres, car je n'avais pas les autorisations appropriées. J'ai donc choisi "Exporter les lignes de la grille" et sauvegardé la sortie au format UTF-8.
La version psql
donnée par @Brian ne fonctionnait pas non plus pour moi, pour une raison différente. La raison pour laquelle cela n'a pas fonctionné est qu'apparemment, l'invite de commande de Windows (j'utilisais Windows) se mêlait de l'encodage par elle-même. J'ai gardé cette erreur:
ERREUR: le caractère avec la séquence d'octets 0x81 dans le codage "WIN1252" n'a pas d'équivalent dans le codage "UTF8"
La solution que j’ai utilisée consistait à écrire un court script JDBC (Java) qui lisait le fichier CSV et émettait des instructions d’insertion directement dans ma table Postgres. Cela a fonctionné, mais l'invite de commande aurait également fonctionné si le codage n'avait pas été modifié.
copier (n'importe quelle requête datawanttoexport) dans 'fileablsoutepathwihname' délimiter ',' en-tête csv;
En utilisant cet outil, vous pouvez également exporter des données.