2010-03-24 8 views
5

Con la nueva funcionalidad multi-db de Django en la versión de desarrollo, he estado tratando de crear un comando de administración que nos permita sincronizar los datos del sitio en vivo con un desarrollador máquina para pruebas prolongadas. (Tener datos reales, particularmente los datos ingresados ​​por el usuario, me permite probar una gama más amplia de entradas.)Sincronizando datos entre las bases de datos devel/live en Django

Ahora tengo un comando de trabajo "en su mayoría". Puede sincronizar datos de modelo "simple" pero el problema que tengo es que ignora los campos ManyToMany que no veo ningún motivo para hacerlo. ¿Alguien tiene alguna idea de cómo solucionar eso o una mejor manera de manejar esto? ¿Debo exportar esa primera consulta a un dispositivo primero y luego volver a importarlo?

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

¿Funciona esto para claves externas? –

+0

@Ofri - Si existe un registro con esa PK, funciona, pero asegurarse de que las cosas se crean "en orden" es un poco difícil –

+0

¿Entonces quizás sea el mismo problema para M2M? tienen que ser creados después de sus dos modelos. –

Respuesta

0

Esto no responde a su pregunta exactamente, pero ¿por qué no hacer un volcado de una base de datos db y restaurar?

2

Django extensión de comando Dumpscript debería ayudar mucho.

+0

Esto parece tener cierta promesa. Voy a jugar con eso. –

Cuestiones relacionadas