2013-08-31 14 views
14

Mam dwie bazy danych i dwa modele: administratora i użytkownika.wiele baz danych i wiele modeli w django

Chcę zsynchronizować moje modele z dwiema bazami danych; model administracyjny do bazy danych A i modelu użytkownika do bazy danych B;

Jeśli ustawiam ścieżkę modelu na INSTALLED_APPS i syncdb, oba modele zostaną zsynchronizowane z domyślną bazą danych.

jeśli ustawić bazę w poleceniu syncdb takich jak sync --database="B", a dwa modele będą zsynchronizowane z bazy B.

Więc mój problem jest, jak mogę zsynchronizować dwa modele do dwóch baz danych?

+0

@alecxe - nie OP ale stały mój problem :) – whoisearth

Odpowiedz

14

W celu określenia specyficznych baz danych wykorzystywanych do konkretnych modeli, trzeba zdefiniować database router:

Najprostszym sposobem korzystania z wielu baz danych jest utworzenie systemu routingu w bazie . Domyślny schemat routingu zapewnia, że ​​obiekty pozostają "przyklejone" do ich oryginalnej bazy danych (tj. Obiekt pobrany z baza danych foo zostanie zapisana w tej samej bazie danych). Domyślny schemat routingu zapewnia, że ​​jeśli baza danych nie zostanie określona, ​​wszystkie zapytania o numer powrócą do domyślnej bazy danych.

Zobacz ten fragment jako przykład: http://djangosnippets.org/snippets/2687/

również zobaczyć:

+0

alecxe, thx, ale co app_label powinno? Ustawiam app_label w modelach django? – young001

+0

To naprawdę nie ma znaczenia i zależy od tego, jak zaimplementujesz swój router. FYI, istnieje [przykład w dokumentach django] (https: //docs.djangoproject.com/en/dev/topics/db/multi-db/# using-routery), który pokazuje jak używać 'app_label' do routingu. – alecxe

+0

w https://thenewcircle.com/s/post/1242/django_multiple_database_support, daje: if model._meta.app_label == 'chinook': zwraca "chinookdb", więc jeśli chcę model do działania na chinookdb Powinienem dodać app_label w meta, prawda? – young001

18

Całkowicie zgadzam się z @alecxe na korzystanie z routera bazy danych. Obecnie używam jednego interfejsu administratora do zarządzania wieloma bazami danych. Zauważ, że uwierzytelnianie dla wszystkich baz danych jest przechowywane w domyślnej bazie danych, więc kiedy robisz syncdb (bez argumentów).

Generic Router Database

znalazłem this realizację być bardzo elastyczne i użyteczne.

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': '',      
    }, 
} 

Przykładowe modele

# 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 
+0

W obu zdefiniowanych modelach ustawiono app_label na "mux_data". Czy to celowe, aby pokazać, że oba te modele trafią do bazy danych t29_db? Jeśli więc jakikolwiek inny model ma etykietę app_label "T50_VATC", zostanie to zapisane w db t50_db. –

+0

@VikasNehaOjha Tak, to było zamierzone. Miało to pokazać, że każdy model może kontrolować, gdzie przechowywane są dane. –

+0

Dzięki. Twoja odpowiedź mi pomogła. –