2012-12-07 15 views
15

Mam wiele aplikacji w mojej witrynie django. jakCzy mogę używać różnych baz danych dla różnych aplikacji w django

mainsite blog tutorials

ale chcę, aby przechowywać różne modele w różnych bazach danych tak, że mogą one być oddzielone

mogę to zrobić w Django

+0

Może istotne: 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/ –

Odpowiedz

21

Oto, co masz zrobić, aby zacząć.

1) Zaktualizuj ustawienia dla baz danych, których chcesz użyć.

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) Dla każdej bazy danych, wdrożenie routera bazy danych, która będzie kierować zapytania odpowiednio. W twoim przypadku implementuj w każdej aplikacji. Zauważ, że to mniej więcej pochodzi z dokumentacji 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) Aktualizacja DATABASE_ROUTERS w settings.py

settings.py

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

Czy to wszystko. Mam na myśli, że kiedy tworzę modele z poziomu administratora, automatycznie będą zapisywane w drugiej bazie danych. lub muszę zrobić więcej rzeczy dla administratora – user825904

+0

Musisz zrobić syncdb, myślę, że być może będziesz musiał zrobić reset, jeśli DB są już obecne. – Rohan

+0

Chciałbym zasugerować, aby zmienić nazwę bazy danych z "app1" na db_app1 w celu rozróżnienia, kiedy powinna być używana nazwa bazy danych i kiedy powinna być używana. –

Powiązane problemy