2017-01-10 1 views
0

Je veux garder une base de données constamment mise à jour avec les informations que je récupère d'une API. Les données que je reçois peuvent être incomplètes mais je devrais en avoir la plus grande partie. Jusqu'à présent, j'ai une clause try/except où j'essaie d'insérer une ligne dans ma base de données et à moins que je ne mette à jour la ligne. Le problème principal est que je ne supprime aucune ligne. Je veux avoir une copie des données du serveur à tout moment, ou au moins rester proche de lui. Je dois en quelque sorte garder une trace des lignes que j'ai besoin de supprimer au fil du temps parce que je veux m'assurer que ce n'est pas seulement le grattoir qui me donne des données incomplètes. Par ailleurs, j'utilise Python et psycopg2. Je pense que c'est un problème courant mais je ne trouve pas de meilleure solution pour créer une nouvelle base de données, la mettre à jour plusieurs fois avec ce que j'ai actuellement et ensuite remplacer les bases de données. Aucune suggestion? Je n'aime pas non plus le fait que je m'attends à ce que la clause d'exception soit souvent déclenchée ici ...Copiez une base de données via des mises à jour/insertions et des suppressions dans postgresql.

Merci d'avance!

Répondre

1

L'absence d'un upsert (l'équivalent de MySQL INSERT ... ON DUPLICATE KEY UPDATE) a longtemps été une épine dans l'esprit de Postgresql. Généralement, votre approche est la meilleure façon de le faire. Cependant, il y a un problème en ce qu'il n'est pas atomique - entre le moment où votre exception se produit et que vous essayez de mettre à jour, la ligne peut avoir été mise à jour par un autre processus. Souvent, cela amène les gens à construire des lignes immuables, mais c'est un autre sujet.

Apparemment, à partir de Postgres 9.5, ils ont ajouté une clause Upsert. INSERT ... ON CONFLICT ... DO ... (Documentation here).

En faisant d'autres recherches, il semble y avoir une réponse beaucoup plus complète ici: https://stackoverflow.com/a/17267423/1327710.

+0

Upsert semble bien mais ne gère pas les suppressions? Aussi, j'aimerais ajouter une colonne id à ma base de données. Ce sera la seule colonne unique donc il n'y aura pas de conflit à contrarier? Comme les données que je reçois n'a pas d'ID. Je vais lui en assigner une quand il sera inséré pour la première fois. Mais alors je suppose que je dois faire correspondre les lignes et en quelque sorte jeter un conflit à mettre à jour? Merci de votre aide! –