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
Est-ce que cela fonctionne pour les clés étrangères? –
@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 –
Alors peut-être son même problème pour M2M? ils doivent être créés après leurs deux modèles. –