2013-08-31 9 views
14

У меня есть две базы данных и две модели: Администратор и пользователь.несколько баз данных и несколько моделей в django

Я хочу синхронизировать свои модели с двумя базами данных; модель администратора для базы данных A и модель пользователя для базы данных B;

Если я устанавливаю путь модели к INSTALLED_APPS и syncdb, две модели будут синхронизироваться с базой данных по умолчанию.

если установить базу данных в syncdb команды, такие как sync --database="B", и две модели будут синхронизироваться B. базы данных

Так что моя проблема в том, как синхронизировать две модели с двумя базами данных?

+0

@alecxe - не ОП, но вы зафиксировали мой вопрос :) – whoisearth

ответ

14

Для определения конкретных баз данных, используемых для конкретных моделей, то необходимо определить database router:

Самый простой способ использовать несколько баз данных, чтобы создать схему маршрутизации базы данных . Схема маршрутизации по умолчанию гарантирует, что объекты остаются «липкими» в их исходной базе данных (т. Е. Объект, полученный из , база данных foo будет сохранена в той же базе данных). Схема маршрутизации по умолчанию гарантирует, что если база данных не указана, все запросы возвращаются к базе данных по умолчанию.

См этот фрагмент в качестве примера: http://djangosnippets.org/snippets/2687/

Также см:

+0

alecxe, ТНХ, но то, что app_label должен? Я установил app_label в моделях django? – young001

+0

Это не имеет большого значения, и это зависит от того, как вы будете реализовывать свой маршрутизатор. FYI, есть [пример в django docs] (https: //docs.djangoproject.com/en/dev/themes/db/multi-db/# using-routers), который показывает, как использовать 'app_label' для маршрутизации. – alecxe

+0

в https://thenewcircle.com/s/post/1242/django_multiple_database_support, он дает: if model._meta.app_label == 'chinook': return 'chinookdb', поэтому, если я хочу, чтобы модель работала на chinookdb , Я должен добавить app_label в мета, верно? – young001

18

Я полностью согласен с @alecxe при использовании маршрутизатора базы данных. В настоящее время я использую один интерфейс администратора для управления несколькими базами данных. Обратите внимание, что аутентификация для всех баз данных хранится в базе данных по умолчанию, поэтому, когда вы делаете syncdb (без аргументов).

Generic Database Router

Я нашел this реализацию чрезвычайно гибкой и полезной.

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

Примеры моделей

# 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

В обеих указанных моделях вы установили app_label в 'mux_data'. Разве это намеренно показать, что обе эти модели перейдут в базу данных t29_db? И если любая другая модель имеет app_label 'T50_VATC', это будет сохранено в db t50_db. –

+0

@VikasNehaOjha Да, это было намеренно. Это должно было показать, что каждая модель может контролировать, где хранятся данные. –

+0

Спасибо. Ваш ответ помог мне. –

Смежные вопросы