2013-08-31 47 views
14

我有兩個數據庫和兩個模型:管理員和用戶。django中的多個數據庫和多個模型

我想將我的模型同步到兩個數據庫; 管理員模型到數據庫A和用戶模型到數據庫B;

如果我將模型路徑設置爲INSTALLED_APPSsyncdb,則兩個模型將同步到默認數據庫。

,如果我在syncdb命令如sync --database="B"設置數據庫,以及兩款車型將同步到數據庫B.

所以我的問題是,如何同步兩個模型兩個數據庫?

+0

@alecxe - 而不是OP但你固定我的問題:) – whoisearth

回答

14

爲了確定用於特定模型的特定數據庫,您需要定義一個database router

使用多個數據庫的最簡單方法是建立一個數據庫, 路由方案。默認路由方案確保對象保持 對其原始數據庫'粘性'(即從 檢索到的對象,foo數據庫將被保存在同一數據庫中)。默認的 路由方案可確保如果未指定數據庫,則所有查詢 都將回退到默認數據庫。

見這個片段作爲一個例子:http://djangosnippets.org/snippets/2687/

另見:

+0

alecxe,THX,但什麼app_label應注意什麼?我在django模型中設置了app_label? – young001

+0

這並不重要,它取決於你將如何實現你的路由器。僅供參考,[在django文檔中有示例](https://docs.djangoproject。com/en/dev/topics/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': 返回'chinookdb',所以如果我想要一個模型來操作chinookdb ,我應該在元中添加一個app_label,對吧? – young001

18

我完全同意@alecxe使用數據庫路由器。我目前使用單個管理界面來管理多個數據庫。請注意,所有數據庫的身份驗證都存儲在默認數據庫中,因此當您執行syncdb(不帶參數)時。

通用數據庫路由器

我發現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

謝謝。你的回答幫助了我。 –