J'ai deux bases de données et deux modèles: l'administrateur et l'utilisateur.
Je veux synchroniser mes modèles avec les deux bases de données; modèle administrateur vers la base de données A et modèle utilisateur vers la base de données B;
Si je configure le chemin du modèle sur INSTALLED_APPS
et syncdb
, les deux modèles se synchroniseront avec la base de données par défaut.
si je définis la base de données dans la commande syncdb
telle que sync --database="B"
, et les deux modèles se synchroniseront avec la base de données B.
Mon problème est donc de savoir comment synchroniser les deux modèles avec deux bases de données?
Je suis entièrement d'accord avec @alecxe sur l'utilisation du routeur de base de données. J'utilise actuellement une seule interface d'administration pour gérer plusieurs bases de données. Notez que l'authentification pour toutes les bases de données est stockée dans la base de données par défaut, donc lorsque vous effectuez la syncdb
(sans arguments).
Routeur de base de données générique
J'ai trouvé l'implémentation de this extrêmement flexible et utile.
Settings.py
# Define the database manager to setup the various projects
DATABASE_ROUTERS = ['manager.router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'mux_data': 't29_db',
'T50_VATC':'t50_db'}
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'fail_over',
'USER': 'SomeUser',
'PASSWORD': 'SomePassword',
'Host': '127.0.0.1',
'PORT': '',
},
't29_db': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'mux_stage',
'USER': 'SomeUser',
'PASSWORD': 'SomePassword',
'Host': '127.0.0.1',
'PORT': '',
},
't50_db': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 't50_vatc',
'USER': 'SomeUser',
'PASSWORD': 'SomePassword',
'Host': '127.0.0.1',
'PORT': '',
},
}
Exemples de modèles
# Create your models here.
class Card_Test(models.Model):
name = models.TextField(max_length=100)
description = models.TextField(max_length=200)
units = models.TextField(max_length=500)
result_tags = models.TextField(max_length=500)
class Meta:
app_label = 'mux_data'
def __unicode__(self):
return self.name
class Status_Type(models.Model):
status = models.CharField(max_length=25)
class Meta:
app_label = 'mux_data'
def __unicode__(self):
return self.status
Afin de définir des bases de données spécifiques utilisées pour des modèles spécifiques, vous devez définir un routeur de base de données :
La façon la plus simple d'utiliser plusieurs bases de données consiste à configurer un schéma de routage de base de données. Le schéma de routage par défaut garantit que les objets restent "collants" à leur base de données d'origine (c'est-à-dire qu'un objet récupéré de la base de données foo sera enregistré sur la même base de données). Le schéma de routage par défaut garantit que si aucune base de données n'est spécifiée, toutes les requêtes reviennent à la base de données par défaut.
Voir cet extrait de code à titre d'exemple: http://djangosnippets.org/snippets/2687/
Regarde aussi: