2010-03-24 3 views
5

Avec la nouvelle fonctionnalité multi-db de Django dans la version de développement, j'ai essayé de créer une commande de gestion qui me permet de synchroniser les données du site en direct vers un développeur machine pour des tests prolongés. (Le fait d'avoir des données réelles, en particulier des données saisies par l'utilisateur, me permet de tester une plus large gamme d'entrées.)Synchronisation des données entre les bases de données devel/live dans Django

À l'heure actuelle, j'ai une commande de fonctionnement «principalement». Il peut synchroniser des données de modèle "simples" mais le problème que j'ai est qu'il ignore les champs ManyToMany dont je ne vois aucune raison pour cela. Quelqu'un at-il des idées sur la façon de résoudre ce problème ou de mieux gérer cela? Dois-je d'abord exporter cette première requête vers un appareil puis la réimporter?

from django.core.management.base import LabelCommand 
from django.db.utils import IntegrityError 
from django.db import models 
from django.conf import settings 

LIVE_DATABASE_KEY = 'live' 

class Command(LabelCommand): 
    help = ("Synchronizes the data between the local machine and the live server") 
    args = "APP_NAME" 
    label = 'application name' 

    requires_model_validation = False 
    can_import_settings = True 

    def handle_label(self, label, **options): 

     # Make sure we're running the command on a developer machine and that we've got the right settings 
     db_settings = getattr(settings, 'DATABASES', {}) 
     if not LIVE_DATABASE_KEY in db_settings: 
      print 'Could not find "%s" in database settings.' % LIVE_DATABASE_KEY 
      return 

     if db_settings.get('default') == db_settings.get(LIVE_DATABASE_KEY): 
      print 'Data cannot synchronize with self. This command must be run on a non-production server.' 
      return 

     # Fetch all models for the given app 
     try: 
      app = models.get_app(label) 
      app_models = models.get_models(app) 
     except: 
      print "The app '%s' could not be found or models could not be loaded for it." % label 

     for model in app_models: 
      print 'Syncing %s.%s ...' % (model._meta.app_label, model._meta.object_name) 

      # Query each model from the live site 
      qs = model.objects.all().using(LIVE_DATABASE_KEY) 

      # ...and save it to the local database 
      for record in qs: 
       try: 
        record.save(using='default') 
       except IntegrityError: 
        # Skip as the record probably already exists 
        pass 
+0

Est-ce que cela fonctionne pour les clés étrangères? –

+0

@Ofri - Si un enregistrement avec ce PK existe, cela fonctionne, mais faire en sorte que les choses sont créées "dans l'ordre" est un peu difficile –

+0

Alors peut-être son même problème pour M2M? ils doivent être créés après leurs deux modèles. –

Répondre

0

Ceci ne répond pas exactement à votre question, mais pourquoi ne pas simplement faire un db dump et une restauration db?

2

L'extension de commande Django Dumpscript devrait aider beaucoup.

+0

Cela semble avoir une certaine promesse. Je vais jouer avec ça. –

Questions connexes