Конфигурация нескольких баз данных в Django 1.2 - PullRequest
20 голосов
/ 03 сентября 2010

Надеюсь, это простой вопрос.

У меня возникли проблемы с пониманием документации для новой функции нескольких баз данных в Django 1.2.Прежде всего, я не могу найти пример того, как вы на самом деле ИСПОЛЬЗУЕТЕ вторую базу данных в одной из ваших моделей.

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

Мой файл 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',                  
    }

}

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

Ответы [ 3 ]

25 голосов
/ 03 сентября 2010

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

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

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

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

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, который находился в той же папке, что и модели для вашего приложения.

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

from asterisk import *

Тогда, когда вы фактически запрашиваете запись у этой модели, она работает примерно так:

  1. records = MyModel.object.all()
  2. модуль для MyModel является 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...

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

8 голосов
/ 15 февраля 2011

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

def allow_syncdb(self, db, model):
    if hasattr(model,'connection_name'):
        return model.connection_name == db
    return db == 'default'
3 голосов
/ 03 сентября 2010
...