2010-03-24 3 views
5

С новой многофункциональной функциональностью Django в версии разработки я пытался работать над созданием команды управления, которая позволяет мне синхронизировать данные с сайта live до разработчика машина для расширенного тестирования. (Имея фактические данные, в частности введенные пользователем данные, позволяет мне тестировать более широкий диапазон входов.)Синхронизация данных между базами данных devel/live в Django

Прямо сейчас у меня есть «основная» рабочая команда. Он может синхронизировать «простые» данные модели, но проблема, с которой я сталкиваюсь, заключается в том, что она игнорирует поля ManyToMany, которые я не вижу в этом никаких причин. У кого-нибудь есть идеи о том, как исправить это или лучше хотеть справиться с этим? Должен ли я сначала экспортировать этот первый запрос на прибор, а затем повторно импортировать его?

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

Это работает для внешних ключей? –

+0

@Ofri - Если запись с этим PK существует, она работает, но убедитесь, что все создано «по порядку» немного сложно –

+0

Тогда, может быть, это та же проблема для M2M? они должны быть созданы после обеих моделей. –

ответ

0

Это не отвечает на ваш вопрос именно так, но почему бы не просто сбросить db и восстановить db?

2

Расширение команды Django Dumpscript должно помочь.

+0

У этого, похоже, есть некоторые перспективы. Я поиграю с этим. –