Question

Dans un environnement multi-bases de données, comment déplacer toutes les données d'une base de données à une autre ?

Les paramètres ressemblent à ceci :

DATABASES = {
    'default': {},
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.sqlite3',
        'USER': 'user',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'cust',
        'PASSWORD': 'veryPriv@ate'
    }
}

Existe-t-il une solution/application simple pour ce faire ?Bien qu'une migration unidirectionnelle soit suffisante, car il existe des dizaines de modèles et d'objets avec des clés étrangères complexes et des connexions plusieurs-à-plusieurs, itérer sur les modèles et les objets et les enregistrer dans un autre ne résout pas mon problème.

loaddata échoue également, car la création d'objets utilise des signaux pour créer d'autres objets, ce qui gâche les clés uniques.

L'utilisation de dumps SQL n'est même pas triviale, car les backends sont différents.J'ai essayé cela, je n'ai pas réussi à faire des dumps psql à partir de ma base de données sqlite3, qui ne gâchent pas les clés étrangères.

J'ai donc besoin d'une solution qui charge les données d'une base de données à une autre, mais n'envoie pas de signaux et fonctionne également avec des clés étrangères.Mais je n'ai rien trouvé qui fasse ça.

Était-ce utile?

La solution

Finalement, j'ai réussi à résoudre ce problème.

J'ai créé des tableaux en utilisant

manage.py syncdb --all
manage.py migrate --fake

Chargement des dumps avec loaddata n'a pas fonctionné en raison de problèmes d'intégrité.(Contraintes de clé étrangère brisées, par exemple)

J'ai donc dû modifier mes tables.J'ai supprimé les contraintes brisées, et j'ai ensuite pu exécuter loaddata sans aucun problème.

Cependant, bien sûr, ma base de données était toujours en panne depuis que j'ai supprimé quelques contraintes.Par conséquent, j'ai simplement dû modifier à nouveau mes tables, en utilisant psql coquille.

pgAdmin s'est avéré pratique, car affiche les requêtes de vidage pertinentes sur une interface conviviale, séparément pour chaque contrainte différente.

Autres conseils

Je voudrais juste écrire un script python pour migrer l'instance d'une base de données à une autre, Exécutez ce script en utilisant script d'exécution des extensions Django

Par exemple

# Move Foo table data from one to another
for each_foo in Foo.objects.using("users").all():
  # _create foo instance in customer_data
  foo_obj, status = Foo.objects.using("customers").get_or_create(
                                            foo_name=each_foo.foo_name, 
                                            foo_code=each_foo.foo_code)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top