Подтвердить что ты не робот

Множественная конфигурация базы данных в Django 1.2

Это, надеюсь, простой вопрос.

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

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

My 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 раза, прежде чем сдаваться!

4b9b3361

Ответ 1

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

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

Первая опция

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

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

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

from asterisk import *

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

  • records = MyModel.object.all()
  • модуль MyModel - myapp.asterisk
  • существует соединение под названием "звездочка", поэтому используйте вместо "default"

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

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

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...

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

Ответ 2

Добавление к Иорданцам выше. Для второго варианта метод allow_syncdb работает правильно:

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