qq idées :
* tout mettre
sparky/ = 6 Novembre, 2007 - 15:12
qq idées :
* tout mettre dans une table et puis lancer une procédure plpgsql,
* trigger before insert/update
* procédure stockée select add_or_update(valeur,....)
Il y a probablement d'autres façons, personnellement je préfère le trigger, la régle sera toujours évaluée même si j'essaie insérer manuellement
[ Vous devez
vous connecter pour poster des commentaires ]
Merci pour ces quelques idée
paftek/ = 9 Novembre, 2007 - 15:31
Merci pour ces quelques idées !
Je vais mettre en pratique tout ça, et je ferai un retour si jamais ça intéresse quelqu'un.
[ Vous devez
vous connecter pour poster des commentaires ]
Retour
SAS/ = 16 Novembre, 2007 - 13:28
Oui, oui, un retour intéressera sûrement quelqu'un !
Librement,
Stéphane Schildknecht
dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
Premier retour
paftek/ = 29 Novembre, 2007 - 13:08
Bon,
A ce jour, la solution adoptée n'a rien de spectaculaire :
Je tente systématiquement un UPDATE. Si aucune ligne n'a été modifiée, j'effectue un INSERT.
Je n'ai rien trouvé de mieux, car j'ai plusieurs contraintes à respecter (je me rends compte que j'avais oublié de vous les exposer) :
- L'utilisateur n'est pas obligé de remplir toutes les colonnes
- Lors d'un INSERT, certains colonnes doivent être obligatoirement remplies
- Lors d'un UPDATE, les colonnes obligatoires précitées ne sont plus forcemment requises : on doit pouvoir mettre à jour qu'une seule colonne, par exemple
Pour résumer, on respecte les colonnes obligatoires lors d'un INSERT, mais cette contrainte disparaît lors d'un UPDATE. De plus, un UPDATE doit pouvoir porter sur un nombre quelconque de colonnes (les autres restant intouchées).
Je ne vois pas comment faire autrement, alors n'hésitez pas à me proposer d'autres idées,
Merci !
[ Vous devez
vous connecter pour poster des commentaires ]
Deuxième retour
paftek/ = 6 Mai, 2008 - 17:34
Bonjour,
La solution précédente était finalement loin d'être satisfaisante.
Je me suis inspiré de cet excellent article pour une nouvelle version :
http://www.depesz.com/index.php/2007/09/20/copy-to-existing-table-with-updates/
Résultat ? Le tout est grosso modo 100 fois plus rapide.
Etapes du traitement :
- Lecture du fichier CSV source et pré-traitement en Python
- Chargement des données dans des tables temporaires, au moyen de la commande COPY
- Requêtes INSERT et UPDATE
- Requêtes SQL de post-traitement
C'était finalement pas si compliqué :)
[ Vous devez
vous connecter pour poster des commentaires ]