2015-10-07 94 views
1

在Django中,當使用多個數據庫時如何映射數據庫,例如:從請求中有一個參數作爲app1映射到db1,另一個請求app2映射到db2。現在如何在發送請求到視圖之前選擇db的很多內容Django多個數據庫映射

DATABASE_APPS_MAPPING = {'app1':'db1','app2':'db2'} 


DATABASES = { 
    'default': { 
    }, 
    'db1': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'hp1', 
     'USER': 'server', 
     'PASSWORD': 'hpdata', 
     'HOST': '192.168.3.11', 
     'PORT': '3306' 
    }, 
    'db2': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'hp2', 
     'USER': 'server', 
     'PASSWORD': 'hpdata', 
     'HOST': '192.168.3.11', 
     'PORT': '3306' 
    } 
} 
+0

您是否希望app1中的所有模型都來自db1,並且app2中的所有modesl都將從db2提供? –

+0

我希望模型只能從app1提供,但使用db1和db2 – Rajeev

回答

2

比方說,我可以導入功能,讓我的數據庫:

項目/應用/ views.py:

from .utils import which_db, item_search 
from django.shortcuts import render 
from .models import SomeModel 

def some_view(request): 
    obj = SomeModel.objects.using(which_db(request)).filter(**item_search(request)) 
    return render(request, "some_model.html", {'object':obj} 

這是一個麻煩,每次都要追加使用。有一種方法可以將類似的查詢路由到不同的數據庫(更詳細地記錄爲here)。

項目/ settings.py:

DATABASE_ROUTERS = ['project.db_routes.AppRouter',] 
DB_ROUTING = {'app1':'db1','app2':'db2'} 

項目/ db_routes.py:

from django.conf import settings 


class AppRouter: 
    def __init__(self): 
     self.DB = settings.DB_ROUTING 

    def db_for_read(self, model, **hints): 
     return self.DB.get(self.model.app_label, 'default') 

    def db_for_write(self, model, **hints): 
     return self.DB.get(self.model.app_label, 'default') 

    def allow_relation(self, obj1, obj2, **hints): 
     return True 

    def allow_migrate(self, db, app_label, model=None, **hints): 
     return self.DB.get(app_label, None) 

我假設你希望能夠有數據庫之間foreignkeys。如果不是,則從allow_relation返回False。 allow_migrate確保對象只存在於其正確的數據庫中。

我還沒有測試過這個解決方案,但它確實符合文檔。

+0

您不清楚您在詢問什麼。我看到你正在努力。所以我是。你似乎想要做的是寫一個管理器設置正確的使用條款(但管理器無法訪問請求)。沒有中間件掛鉤來處理SQL查詢。你的用例可能適用於數據庫路由。 –

+0

我的問題很簡單,從我的請求我會知道我是否必須使用app1或app2 .so當我知道我必須使用app2中間件應該做什麼來設置app2的連接,而不是像在視圖中設置它SomeModel.objects.using(which_db(request))。filter()在視圖 – Rajeev

+0

這裏沒有中間件。嘗試路由解決方案。我認爲它做到了你想要的。 –