2010-09-07 7 views
1

J'ai deux sites Django: un pour le développement et un pour la production. De temps en temps, les données de la base de données de développement doivent être transférées dans la base de données de production ou inversement. J'utilise postgresql.Ajout manuel de causes causes IntegrityError

Cela fonctionne très bien: je vide les tables de la base de données sur laquelle je veux copier, je génère sql à partir des tables applicables et j'insère les données dans les tables vides. Jusqu'ici tout va bien.

Mais lorsque j'entre des données dans la base de données via l'interface d'administration, Django lève IntegrityErrors, car appname_modelname_pkey existe déjà.

Je pense que c'est parce que l'interface d'administration veut ajouter des données avec l'ID 1, mais c'est déjà un enregistrement importé. Django ne sait pas que l'identifiant '1' est déjà pris.

Comment résoudre ce problème? Je veux que Django incrémente l'identifiant (comme le ferait auto_increment SQL), peu importe les données déjà stockées.

Toute aide est appréciée!

+0

Vous êtes un peu vague quand vous dites "De temps en temps, les données de la base de données de développement doivent être transférées dans la base de données de production ou inversement." Quelles sont exactement les données transférées et quel est leur rapport avec les données déjà présentes dans la ou les tables? Dans un projet que j'ai réalisé il y a environ 3 ans, certaines tables étaient maîtrisées en dev et effacées/réécrites à la mise à jour (par exemple articles) et d'autres (par exemple session) maîtrisées en production et jamais touchées lors de la mise à jour. –

+0

Bonjour Peter. Je veux transférer les données (pas la structure, qui est déjà la même) de certaines tables d'une base de données à l'autre. Vous avez raison: toutes les tables ne sont pas transférées (par exemple, les sessions ne le sont pas). – Patrick

Répondre

0

Si vous utilisez postgres des deux côtés, la séquence associée aux clés primaires sera différente. Par exemple, supposons que vous transférez des données de production en développement. Supposons également que la valeur de la séquence dans la production soit 20 et que la séquence en développement soit 10. Ensuite, le premier nouvel élément que vous ajoutez au développement aura un ID de 11. Cet ID existe probablement déjà dans les données de production. erreur d'intégrité. Lorsque vous restaurez des tables à partir d'un cliché, vous pouvez réinitialiser les séquences en supprimant et en recréant les tables existantes avant la restauration.

(Ou bien, vous pouvez probablement utiliser la commande ALTER SEQUENCE pour synchroniser les séquences. Cependant, je ne suis pas assez familier avec postgres de dire si c'est la bonne façon de le faire.)

+0

Cela a fonctionné, merci beaucoup! J'ai utilisé PhpPgAdmin et modifié des 'séquences' (db -> public -> séquences). – Patrick

Questions connexes