2012-12-07 13 views
15

Ich habe mehrere Apps in meiner Django-Website. wieKann ich verschiedene Datenbanken für verschiedene Anwendungen in Django verwenden

mainsite blog tutorials

Aber ich möchte verschiedene Modelle in verschiedenen Datenbanken speichern, so dass sie

getrennt werden können

Kann ich das in Django

+0

Vielleicht relevant: http://stackoverflow.com/questions/ 7970872/how-to-use-a-different-Datenbank-pro-Anwendung-Instanz-in-Django; https://docs.djangoproject.com/de/dev/topics/db/multi-db/ –

Antwort

21

hier, was Sie haben, ist tun, um loszulegen.

1) Aktualisieren Sie die Einstellungen für die Datenbanken, die Sie verwenden möchten.

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) Für jede Datenbank, eine Datenbank-Router implementieren, die Route in geeigneter Weise die Abfragen werden. In Ihrem Fall implementieren Sie in jeder App. Beachten Sie dies mehr oder weniger aus django docs genommen.

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) Aktualisieren DATABASE_ROUTERS in settings.py

settings.py

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

Ist das alles? Ich meine, wenn ich Modelle von Admin erstelle, werden sie automatisch in der zweiten Datenbank gespeichert. oder ich muss mehr dinge für admin tun – user825904

+0

Sie müssen syncdb tun, ich denke, Sie müssen möglicherweise zurückgesetzt werden, wenn DBs bereits vorhanden sind. – Rohan

+0

Ich würde vorschlagen, den Namen der Datenbank von "app1" zu db_app1 zu ändern, um zu unterscheiden, wann der DB-Name verwendet werden sollte und wann die App verwendet werden sollte. –

Verwandte Themen