PostgreSQL CSV import from command line

j'ai utilisé le terminal postgres de psql pour importer des fichiers CSV dans des tables en utilisant le

COPY tbname FROM
'/tmp/the_file.csv'
delimiter '|' csv;

ce qui fonctionne très bien sauf que je dois être connecté dans le terminal psql pour l'exécuter.

je voudrais savoir si quelqu'un connaît une façon de faire une commande similaire à celle-ci depuis la ligne de commande de l'interpréteur de commandes Linux similaire à la façon dont Postgres autorise une commande de l'interpréteur de commandes comme bellow

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql

cela permet le dumping d'une base de données à partir du shell Linux sans être connecté au terminal psql.

20
demandé sur Trent 2015-02-19 12:24:52

4 réponses

comme indiqué dans la Documentation PostgreSQL ( II. PostgreSQL Client Applications-psql), vous pouvez passer une commande psql avec le commutateur -c:

psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
23
répondu Simo Kivistö 2015-03-11 18:31:26

la solution dans la réponse acceptée ne fonctionnera que sur le serveur et lorsque l'utilisateur exécutant la requête aura les permissions de lire le fichier comme expliqué dans ceci AFIN de répondre à.

sinon, une approche plus flexible est de remplacer lesCOPY commande psql's "méta-commande" appelé \copy qui prend toutes les mêmes options que la copie" réelle", mais est exécuté à l'intérieur du client (pas besoin de ; à la fin):

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

selon docs, le \copy commande:

effectue une copie frontend (client). Il s'agit d'une opération qui exécute une commande de copie SQL, mais au lieu que le serveur lise ou écrive le fichier spécifié, psql lit ou écrit le fichier et achemine les données entre le serveur et le système de fichiers local. Cela signifie que l'accessibilité aux fichiers et les privilèges sont ceux de l'utilisateur local, pas du serveur, et pas de privilèges de super-utilisateur SQL sont requis.


en outre, si le the_file.csv contient l'en-tête dans la première ligne, il peut être reconnu en ajoutant header à la fin de la commande ci-dessus:

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"
18
répondu Dmitri Zaitsev 2017-05-23 12:10:15

la manière la plus flexible est d'utiliser un shell HERE document, qui vous permet d'utiliser des variables shell à l'intérieur de votre requête, même à l'intérieur (simple ou double) cite:

#!/bin/sh

THE_USER=moi
THE_DB=stuff
THE_TABLE=personnel
PSQL=/opt/postgresql/bin/psql
THE_DIR=/tmp
THE_FILE=the_file.csv

${PSQL} -U ${THE_USER} ${THE_DB} <<OMG
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv;
OMG
3
répondu wildplasser 2015-03-11 18:45:52

De la réponse, je dirais:

psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
3
répondu Andrea Araldo 2017-05-23 12:01:59