2017-02-08 3 views
0

Я пытаюсь создать Q/сайт, используя Django, и я хочу использовать Mutiple базы данных для всех приложенийMultiple базы данных в Django

  • Две безопасной базы данных, как администратора, авторизация, форум
  • Менее безопасная (например, sqlite3) база данных для отдыха

Но я не хочу перенастраивать свои модели и приложения.

Как это сделать?

N.B: форум является приложением, которое реализует Q/сайт

ответ

2

Я имею в виду, вы, очевидно, придется сделать некоторые изменения конфигурации.

В целом, установите наиболее часто используемую базу данных по умолчанию, а другую - как что-то еще - это адаптировано из одного из моих списков db с производственного сайта.

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'databasename', 
     'USER': 'mydefaultuser', 
     'PASSWORD': 'novelpassword', 
     'HOST':'first-host.com', 
     'PORT':'3306' 
    }, 
    'auth': { 
     'ENGINE': 'sqlserver_pymssql', 
     'HOST': 'myserver.com', 
     'NAME': 'myauthdatabase', 
     'PASSWORD': 'passwordhere', 
     'PORT': 1433, 
     'USER': 'username' 
    }} 

Затем вы можете использовать й eother базы данных в явном виде в своих взглядах, используя using: User.objects.using('auth').all()

... или предпочтительно, вы можете установить его более широко используя Database Router:

class AuthRouter(object): 
    """ 
    A router to control all database operations on models in the 
    auth application. 
    """ 
    def db_for_read(self, model, **hints): 
     """ 
     Attempts to read auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     return None 

    def db_for_write(self, model, **hints): 
     """ 
     Attempts to write auth models go to auth_db. 
     """ 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     """ 
     Allow relations if a model in the auth app is involved. 
     """ 
     if obj1._meta.app_label == 'auth' or \ 
      obj2._meta.app_label == 'auth': 
      return True 
     return None 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     """ 
     Make sure the auth app only appears in the 'auth_db' 
     database. 
     """ 
     if app_label == 'auth': 
      return db == 'auth_db' 
     return None 

Добавление DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter'] в ваш файл настроек - это только примеры, взятые из документов по ссылкам выше, но это относительно просто.

Я бы сказать, что если у вас есть супер ясная и сжатая причина почему вы хотите сделать это, не делайте этого. Вы можете обрабатывать все это в одной базе данных, и как только вы пройдете маршрут множественной базы данных, вы сразу же получите cross-database limitations - всегда стоит иметь в виду.

+0

Спасибо за помощь !!! Но можете ли вы объяснить мне больше о маршрутах базы данных? –

+0

Что вам нужно объяснить? Работоспособный пример - буквально в ответе и в документах. «Можете ли вы объяснить больше» [это плохой вопрос] (http://stackoverflow.com/help/how-to-ask) - что конкретно вам нужно? Кроме того, если документы для этого не ясны для вас, я действительно рекомендую не следовать этому подходу! – Withnail

+0

Концепция маршрутизаторов баз данных. Можете ли вы объяснить это? Как, где он должен оставаться? Являются ли маршрутизаторы конкретными для приложений или для баз данных ??? Где я должен хранить свои маршрутизаторы и некоторые рабочие примеры, возможно, –

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