Copy et autoincrément
SAS/ = 22 Avril, 2008 - 23:10
Bonsoir,
Vous pouvez utiliser la magie des autoincréments dans les opérations de Copy.
Vous pouvez, par exemple, préciser les champs à copier, en omettant le champ serial :
create matable(
id serial,
champ2 text,
champ3 text);
COPY matable(champ2, champ3) from stdin;
blabla;toto
bibli;titi
\.
Cela incrémentera la séquence.
Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
oui j'y avait pensé mais le
ee_lars/ = 23 Avril, 2008 - 08:29
oui j'y avait pensé mais le problème est que j'utilise une boucle dans mon script shell, qui scrute dans un simple fichier texte les tables à importer :
for ligne in $(cat $SQL/tables.txt); do
psql -d $BASE -U $USERPG -c "COPY $TABLE FROM $FICEXP/extraction_$TABLE.txt' WITH DELIMITER ':';"
done
Dans ce cas, il semble assez difficile d'indiquer les champs dans le COPY...
Je pensais que COPY pouvait interpreter les SERIAL directement (sans avoir à spécifier les champs à importer...) y-a-t'il un moyen commode de le faire???
Merci pour votre réponse en tout cas.
[ Vous devez
vous connecter pour poster des commentaires ]
Autre méthode
SAS/ = 23 Avril, 2008 - 10:07
Bonjour,
Copy ne va pas savoir déterminer quelle colonne manque dans la ligne, et sortira en erreur.
La colonne serial est-elle dans le ficheir csv ?
Si oui, on peut mettre à jour la valeur de la colonne après insertion.
Si non, peut-être pourriez-vous créer la colonne après insertion des données ?
Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
Non elle ne l'est pas...
A l
ee_lars/ = 23 Avril, 2008 - 14:12
Non elle ne l'est pas...
A la limite, je peux importer la clé primaire de la table ORACLE (auquel cas l'autoincrément du SERIAL ne me sert à rien).
Vous parlez de créer la colonne après insertion dans le fichier CSV???
[ Vous devez
vous connecter pour poster des commentaires ]
Désolé pour le manque d'inf
ee_lars/ = 24 Avril, 2008 - 11:19
Désolé pour le manque d'information :
Il s'agit en fait d'une application web qui liste des relevés de consommation concernant des services divers.
Les informations de consommation proviennent d'une base de données ORACLE d'un applicatif propriétaire.
Nous devons donc extraire les une partie des information de la base dans une base POSTGRESQL.
L'applicatif étant en PHP, nous avons commencé par faire le transfert via des scripts PHP (avec l'extension OCI8), mais, au vue des opérations effectuées, un script shell va être beaucoup plus simple à mettre en place, à maintenir et va surtout être plus rapide...
C'est un apprenti qui avait écrit la structure de la base de données POSTGRESQL ainsi que les scripts de Transfert PHP.
Tous les jours, les tables voulues sont vidées et les données provenant d'ORACLE sont inserées intégralement (donc il n'y a pas de rajouts manuels dans les tables).
Pour certaines tables, la clé primaire de la base ORACLE est insérée, dans d'autres non, auquel cas une nouvelle clé primaire est créee
D'où ma question de départ sur les SERIAL...
Je me dis à présent que nous devons repointer les tables une par une pour voir s'il est possible d'importer la clé primaire d'ORACLE, ce qui simplifierai la démarche...
Merci pour votre aide
[ Vous devez
vous connecter pour poster des commentaires ]
Tant qu'Ã scripter
SAS/ = 25 Avril, 2008 - 08:47
Bonjour,
Si vous en êtes à réécrire les scripts, rien ne vous empêche de les repenser :-)
Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
Oui tout à fait, après rée
ee_lars/ = 25 Avril, 2008 - 14:52
Oui tout à fait, après réecriture, le script fonctionne parfaitement :)
J'ai juste eu des problèmes au niveau du séparateur utilisé par COPY : il ne peut contenir qu'un caractère, ce qui peut être génant quand on a à traiter des centaines de milliers d'insertions... dans mon cas le '~' s'est avéré efficace :)
Merci
[ Vous devez
vous connecter pour poster des commentaires ]