Vous n'êtes pas identifié(e).

#1 07/03/2013 19:58:52

Carmichael_fr
Membre

COPY FROM et COPY FROM STDIN

Bonjour,

Cette demande fait suite à une lecture attentive de la documentation, dans laquelle à mon avis, il manque un exemple pour bien comprendre.
Voici donc la situation : Je travaille sous Unix avec un client Postgres 8.4 qui adresse ses requetes à un serveur distant (qui héberge effectivement la base).

Je voulais faire un chargement de fichier en base de cette façon en me connectant avec le client :

MaBase=# copy MaTable
MaBase-# from 'MonFichierAuMemeFormatQueLaTable.csv'
MaBase-# delimiter ';'
MaBase-# null '';

Ce qui retourne :
ERROR:  could not open file 'MonFichierAuMemeFormatQueLaTable.csv" for reading: No such file or directory

J'ai bien compris que l'erreur provenait du fait que le serveur ne parvenait pas à accéder au fichier.
Comme alternative, il est mentionné dans la documentation d'utiliser STDIN pour une utilisation dans un script (ce sera le cas). Dans ce cas le client enverra les requetes au serveur.
Ce que je ne vois pas bien, c'est, quelle est la syntaxe exacte à utiliser pour mettre en oeuvre STDIN ?

Si j'écris :
MaBase=# copy MaTable
MaBase-# from STDIN
MaBase-# delimiter ';'
MaBase-# null '';
Je ne fais plus de référence à mon fichier csv. Donc ça ne marchera pas.

Si j'écris :
MaBase=# copy MaTable
MaBase-# from 'MonFichierAuMemeFormatQueLaTable.csv' |STDIN
MaBase-# delimiter ';'
MaBase-# null '';

c'est syntaxiquement incorrect.

Pour le moment, le fichier 'MonFichierAuMemeFormatQueLaTable.csv contient :
Champ11; Champ21; Champ31
Champ11; Champ22; Champ32
Champ13; Champ23; Champ33
Champ14; Champ24; Champ34

Dois-je modifier le contenu du fichier csv ?

Donc mes questions sont :
- quelle est la syntaxe exacte à utiliser pour mettre en oeuvre STDIN ?
- dois-je modifier mon fichier dcsv ?

Cordialement

Carmichael

Hors ligne

#2 07/03/2013 20:51:10

rjuju
Administrateur

Re : COPY FROM et COPY FROM STDIN

stdin s'utilise de la manière habituelle :

$ echo "1,'test'" | psql -c "copy test from stdin delimiter ','"
$ psql -c "select * from test"
 id |  val
----+--------
  1 | 'test'
(1 ligne)

Vous avez sinon la méta commande \copy de psql qui permet de faire un COPY depuis un fichier sur le poste client et non sur le serveur.

Hors ligne

#3 08/03/2013 10:22:23

Carmichael_fr
Membre

Re : COPY FROM et COPY FROM STDIN

Bonjour,

Merci de votre intervention. Je suis complètement dépanné.

Pour ceux que ça intéresse, voici le détail, sous Unix :
cat MonFichierAuMemeFormatQueLaTable.csv | psql -c "copy MaTable from stdin delimiter ';' -p 5432 -U NomLogin  NomBase -h NomServeur

Dans le cas ou le nb de colonne dans le fichier est inférieur au nb de colonne dans la table, il faut ajouter la description du nom des colonnes. La commande devient :
cat MonFichierAuMemeFormatQueLaTable.csv | psql -c "copy MaTable (Colonne1, Colonne2, Colonne3) from stdin delimiter ';' -p 5432 -U NomLogin  NomBase -h NomServeur

Cordialement

Carmichael

Hors ligne

Pied de page des forums