我有兩個數據庫和兩個模型:管理員和用戶。django中的多個數據庫和多個模型
我想將我的模型同步到兩個數據庫; 管理員模型到數據庫A和用戶模型到數據庫B;
如果我將模型路徑設置爲INSTALLED_APPS
和syncdb
,則兩個模型將同步到默認數據庫。
,如果我在syncdb
命令如sync --database="B"
設置數據庫,以及兩款車型將同步到數據庫B.
所以我的問題是,如何同步兩個模型兩個數據庫?
我有兩個數據庫和兩個模型:管理員和用戶。django中的多個數據庫和多個模型
我想將我的模型同步到兩個數據庫; 管理員模型到數據庫A和用戶模型到數據庫B;
如果我將模型路徑設置爲INSTALLED_APPS
和syncdb
,則兩個模型將同步到默認數據庫。
,如果我在syncdb
命令如sync --database="B"
設置數據庫,以及兩款車型將同步到數據庫B.
所以我的問題是,如何同步兩個模型兩個數據庫?
爲了確定用於特定模型的特定數據庫,您需要定義一個database router:
使用多個數據庫的最簡單方法是建立一個數據庫, 路由方案。默認路由方案確保對象保持 對其原始數據庫'粘性'(即從 檢索到的對象,foo數據庫將被保存在同一數據庫中)。默認的 路由方案可確保如果未指定數據庫,則所有查詢 都將回退到默認數據庫。
見這個片段作爲一個例子:http://djangosnippets.org/snippets/2687/
另見:
alecxe,THX,但什麼app_label應注意什麼?我在django模型中設置了app_label? – young001
這並不重要,它取決於你將如何實現你的路由器。僅供參考,[在django文檔中有示例](https://docs.djangoproject。com/en/dev/topics/db/multi-db /#using-routers),顯示如何使用'app_label'進行路由。 – alecxe
在https://thenewcircle.com/s/post/1242/django_multiple_database_support,它給出:if model._meta.app_label =='chinook': 返回'chinookdb',所以如果我想要一個模型來操作chinookdb ,我應該在元中添加一個app_label,對吧? – young001
我完全同意@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
在這兩個定義的模型中,您都已將app_label設置爲'mux_data'。這是故意表明,這兩個模型將去數據庫t29_db?所以如果有其他模型有app_label'T50_VATC',那將被保存在db t50_db中。 –
@VikasNehaOjha是的,這是故意的。這表明每個模型都可以控制數據的存儲位置。 –
謝謝。你的回答幫助了我。 –
@alecxe - 而不是OP但你固定我的問題:) – whoisearth