Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables

From: Julien Rouhaud <rjuju123(at)gmail(dot)com>
To: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables
Date: 2011-12-02 15:43:35
Message-ID: CAOBaU_YcaJik2EgnqgSNxz=ArBY_p3msSYDf0eb7==1CS+duCw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

2011/12/2 Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>

> Le vendredi 02/12/11 à 15h35,
> Julien Rouhaud <rjuju123(at)gmail(dot)com> a écrit :
>
> > Bonjour
>
> Bonjour,
>
> > A votre place j'utilisarai le copy vers une table "temporaire"
> > d'importation avec un champ utilisant la séquence id_etudiant,
>
> Vous voulez dire que, les id_etu étant générés par la séquence
> 'seq_etu', le fichier etudiants.csv devrait contenir du genre :
>
> nextval(('seq_etu'::text)::regclass),nom_etudiant_1,prenom_etudiant_1
> nextval(('seq_etu'::text)::regclass),nom_etudiant_2,prenom_etudiant_2
> nextval(('seq_etu'::text)::regclass),nom_etudiant_3,prenom_etudiant_3
> nextval(('seq_etu'::text)::regclass),nom_etudiant_4,prenom_etudiant_4
> nextval(('seq_etu'::text)::regclass),nom_etudiant_5,prenom_etudiant_5
>
> puis qu'il faudrait copier les données de ce fichier dans une table
> temporaire temp_etudiants :
>
> COPY temp_etudiants(id_etu,nom_etu,prenom_etu) FROM
> '/home/bitouze/etudiants.csv' WITH DELIMITER ',';
>
> Si c'est l'esprit de ce que vous me conseillez, j'ai un problème de
> syntaxe avec nextval :
>
> ERROR: invalid input syntax for integer:
> "nextval(('seq_etu'::text)::regclass)"
>
> alors que ce qui suit fonctionne très bien :
>
> insert INTO temp_etu VALUES
> (nextval(('seq_etu'::text)::regclass),'bla','blo');
>
> > que j'utiliserai ensuite pour remplir les tables etudiants
>
> Voulez-vous dire au moyen de :
>
> insert into etudiants(id_etu,nom_etu,prenom_etu) select * from
> temp_etudiants ;
>
> > et etudiants_promotions.
>
> Voulez-vous dire au moyen de :
>
> insert into etudiants_promotions (id_etu,id_promotion) SELECT
> id_etu,42 from temp_etudiants ;
>
> Ça me semble être une bonne idée mais j'attends confirmation de votre
> part avant d'essayer de régler mon problème de syntaxe indiqué
> ci-dessus...
>
> Merci !
> --
> Denis
>

Non, mon idée était de faire une table d'importation de ce genre :
CREATE TABLE etudiant_import (
id_etudiant integer DEFAULT nextval('seq_etu'),
nom_etudiant varchar,
prenom_etudiant varchar);

(la syntaxe n'est peut-être pas bonne, c'est juste pour montrer le but
d'associer le champ id_etudiant de cette table temporaire à la séquence de
la vraie table etudiants).

Ensuite, l'idée est d'importer dans la table etudiant_import sans la
colonne id_etudiant (donc en utilisant la séquence) avec le fichier csv
dont vous disposez.
Ex :
COPY etudiant_import (nom_etudiant,prenom_etudiant) FROM
'/home/bitouze/etudiants.csv' WITH DELIMITER ',';

Du coup, la table etudiant_import contient les étudiants qui viennent
d'être importés avec leur clé finale (pas de doublon possible). Il ne reste
qu'a les copier dans la table etudiants et dans la table
etudiants_promotions à partir de cette table, qui ne contient donc que la
dernière importation. Une fois la copie effectuée un truncate de la table
et l'importation devrait se passer sans trop de risque d'erreur.

PS : j'avais encore oublié le reply all, je remet donc
pgsql-fr-generale(at)postgresql(dot)org en copie hem ^^'

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Denis Bitouzé 2011-12-02 17:24:50 Re: Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables
Previous Message Cédric Villemain 2011-12-02 14:38:01 Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables