Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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.
Julien.
https://rjuju.github.io/
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
Pages : 1