2012-12-07 19 views
15

Ho più app nel mio sito django. comePosso usare diversi database per diverse app in django

mainsite blog tutorials

ma voglio archiviare diversi modelli in diversi database in modo che possano essere separati

posso farlo in Django

+0

Forse rilevanti: http://stackoverflow.com/questions/ 7970872/how-to-use-a-different-database-per-application-instance-in-django; https://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

risposta

21

Ecco cosa si dovrà fare per andare avanti

1) Aggiorna le impostazioni per i database che si desidera utilizzare.

settings.py

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/projectdb' 
} 
'db_app1': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app1db' 
} 
'db_app2': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app2db' 
} 

2) Per ogni database, implementare un router database che instraderà le query in modo appropriato. Nel tuo caso implementa in ogni app. Nota questo più o meno preso da documenti django.

app1.dbRouter.py

# DB router for app1 

class App1DBRouter(object): 
    """ 
    A router to control app1 db operations 
    """ 
    def db_for_read(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def db_for_write(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     "Allow any relation if a model in app1 is involved" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if obj1._meta.app_label == 'app1' or obj2._meta.app_label == 'app1': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     "Make sure the app1 app only appears on the 'app1' db" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if db == 'db_app1': 
      return model._meta.app_label == 'app1' 
     elif model._meta.app_label == 'app1': 
      return False 
     return None 

3) Aggiornare DATABASE_ROUTERS in settings.py

settings.py

DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter'] 
+0

È tutto. Voglio dire quando creo i modelli da admin, verranno automaticamente salvati nel secondo database. o devo fare più cose per l'amministratore – user825904

+0

È necessario fare syncdb, penso che potrebbe essere necessario reimpostare se i DB sono già presenti. – Rohan

+0

Vorrei suggerire di cambiare il nome del db da 'app1' a db_app1 per distinguere quando deve essere usato il nome db e quando deve essere usata l'app. –

Problemi correlati