2015-10-07 6 views
1

В Django при использовании нескольких баз данных DB, как сопоставить базы данных, для ex: от запроса есть параметр 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

Вы хотите, чтобы все модели в приложении 1 обслуживались с db1 и все режимы в app2 для обслуживания с db2? –

+0

Я хочу, чтобы модели обслуживались только с помощью приложения 1, но с использованием 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 между базами данных. Если нет, верните False из allow_relation. allow_migrate обеспечивает защиту объектов только в их соответствующей базе данных.

Я не тестировал это решение, но оно соответствует документации.

+0

Непонятно, что вы просите. Я вижу, вы пытаетесь изо всех сил. Я тоже. То, что вы, похоже, хотите сделать, это либо написать Менеджер, который устанавливает правильное предложение использования (но Менеджер не имеет доступа к запросу). Для обработки SQL-запросов нет промежуточных крючков. Ваш вариант использования может использоваться для маршрутизации базы данных. –

+0

Мой вопрос очень прост, по моему запросу я бы знал, должен ли я использовать app1 или app2 .so, когда я знаю, что мне нужно использовать app2, что нужно делать в промежуточном программном обеспечении, чтобы установить соединения для приложения2, а не устанавливать его в виде SomeModel.objects.using (which_db (request)). Filter() в представлениях – Rajeev

+0

Для этого нет промежуточного программного обеспечения. Попробуйте решение маршрутизации. Я думаю, он делает то, что вы хотите. –

0

Я не совсем уверен, что вы хотите сделать. Но я думаю, что вы найдете ответ на свой вопрос здесь:

https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#topics-db-multi-db-routing

Если вы действительно хотите, чтобы выбрать базу данных на основе URL (подобласти еа), чем вам придется написать собственный класс Middleware:

https://docs.djangoproject.com/en/1.8/topics/http/middleware/

+0

, даже если есть обычное среднее изделие, как выбрать базу данных с приложениями app1 или app2 в любых примерах. – Rajeev

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