2010-09-03 5 views
20

Это, надеюсь, простой вопрос.Конфигурация нескольких баз данных в Django 1.2

У меня возникли проблемы с пониманием документации для новой функции множественной базы данных в Django 1.2. Прежде всего, я не могу найти пример того, как вы фактически используете вторую базу данных в одной из ваших моделей.

Когда я определяю новый класс в моих models.py, как указать, к какой базе данных я собираюсь подключиться?

Мой settings.py содержит что-то похожее на -

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'modules', 
     'USER': 'xxx',      
     'PASSWORD': 'xxx',     
    }, 
    'asterisk': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'users',      
     'USER': 'xxxx',      
     'PASSWORD': 'xxxx',     
    } 

} 

Edit: Я читал документацию на маршрутизаторах, как манекен. Если кто-то еще борется с этим, просто убедитесь, что вы прочитали его 2 или 3 раза, прежде чем сдаться!

ответ

25

Да, это немного сложно.

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

Первый вариант

Вот код, который я использую; Надеюсь, поможет.

from django.db import connections 

class DBRouter(object): 
    """A router to control all database operations on models in 
    the contrib.auth application""" 

    def db_for_read(self, model, **hints): 
     m = model.__module__.split('.') 
     try: 
      d = m[-1] 
      if d in connections: 
       return d 
     except IndexError: 
      pass 
     return None 

    def db_for_write(self, model, **hints): 
     m = model.__module__.split('.') 
     try: 
      d = m[-1] 
      if d in connections: 
       return d 
     except IndexError: 
      pass 
     return None 

    def allow_syncdb(self, db, model): 
     "Make sure syncdb doesn't run on anything but default" 
     if model._meta.app_label == 'myapp': 
      return False 
     elif db == 'default': 
      return True 
     return None 

Как это работает, я создаю файл с именем базы данных, используемым для хранения моих моделей. В вашем случае вы создадите отдельный файл стиля models с именем asterisk.py, который был в той же папке, что и модели для вашего приложения.

  1. records = MyModel.object.all()
  2. модуль для MyModel:

    В файле models.py, вы бы добавить

    from asterisk import * 
    

    Затем, когда вы на самом деле запросить запись из этой модели, это что-то вроде это работает is myapp.asterisk

  3. есть соединение под названием «звездочка», поэтому используйте это вместо «по умолчанию»

Второй вариант

Если вы хотите иметь в-модели управления выбора базы данных, что-то, как это будет работать:

from django.db import connections 

class DBRouter(object): 
    """A router to control all database operations on models in 
    the contrib.auth application""" 

    def db_for_read(self, model, **hints): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

    def db_for_write(self, model, **hints): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

    def allow_syncdb(self, db, model): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

Тогда для каждой модели:

class MyModel(models.Model): 
    connection_name="asterisk" 
    #etc... 

Обратите внимание, что я не тестировал этот второй вариант.

+1

Извините за задержанный ответ, но это было очень полезно! – HurnsMobile

+0

Привет, Я реализовал ваш второй вариант. Он отлично работает, за исключением allow_syncdb. Я отправлю ответ ниже с помощью рабочего allow_syncdb для любых будущих поисковиков. – Rich

+0

Спасибо за это! У меня было какое-то время, пытаясь понять это из django docs. –

3

Не помогает ли документация на automatic database routing и manually selecting a database?

+0

Я может быть что-то, но, насколько я могу сказать, нет примеров того, как определить модель с чем-либо, кроме базы данных по умолчанию отсутствует. – HurnsMobile

+0

+1. Django имеет хорошую документацию, и документы почти всегда являются первым местом для просмотра. –

+1

Как указано в вопросе, у меня возникли проблемы с пониманием документации ... – HurnsMobile

8

Приложение к Иордансу ответит выше.Для второго варианта, метод allow_syncdb корректно работает следующим образом:

def allow_syncdb(self, db, model): 
    if hasattr(model,'connection_name'): 
     return model.connection_name == db 
    return db == 'default' 
+0

Интересно! Итак, вы устанавливаете имя_подключения в модели? –

+0

Да. И он работает довольно хорошо, за исключением полей ManyToMany, где я должен указать «сквозную» модель, иначе Django генерирует таблицу «сквозной» в базе данных по умолчанию. – Rich

+0

Ничего себе! Я определенно сделаю это. Хорошая работа. – HurnsMobile

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