Джанго маршрутизация нескольких баз данных - PullRequest
32 голосов
/ 08 ноября 2011

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

В моих настройках у меня есть:

DATABASES = {
    'default': {
       .... 
    },
    'my_db2': {
       ....
    }
}

DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]

Я знаю, что должен определить свой класс маршрутизатора (я думаю в myapp2.models.py) примерно так:

class MyDB2Router(object):
"""A router to control all database operations on models in
the myapp2 application"""

def db_for_read(self, model, **hints):
    if model._meta.app_label == 'myapp2':
        return 'my_db2'
    return None

def db_for_write(self, model, **hints):
    if model._meta.app_label == 'myapp2':
        return 'my_db2'
    return None

def allow_relation(self, obj1, obj2, **hints):
    if obj1._meta.app_label == 'myapp2' or obj2._meta.app_label == 'myapp2':
        return True
    return None

def allow_syncdb(self, db, model):

    if db == 'my_db2':
        return model._meta.app_label == 'myapp2'
    elif model._meta.app_label == 'myapp2':
        return False
    return None

Тогда что? Требуется ли для каждой модели meta.app_label или это автоматически? Кроме того, я все еще получаю ошибку:

django.core.exceptions.ImproperlyConfigured: Ошибка при импорте маршрутизатора базы данных JournalRouter: "не удается импортировать имя соединения

Может ли кто-нибудь помочь мне понять, что происходит и что не так? Любая помощь высоко ценится.

Ответы [ 4 ]

26 голосов
/ 09 ноября 2011

ОК, поэтому я решил свою проблему.Класс маршрутизатора помещается в отдельный файл с именем routers.py в / myapp2 . meta.app_label не требуется, так как, я думаю, он назначается автоматически.Надеюсь, это кому-нибудь поможет.Я также задокументировал процесс здесь .

6 голосов
/ 26 июля 2013

Мне не помогло, поэтому я сделал некоторую отладку. Возможно, результаты могут спасти кого-то от боли. :) Проблема в django 1.4 - циклическая ссылка, возникающая, когда django пытается импортировать пользовательский класс маршрутизатора.
Это происходит в django.db.utils.ConnectionRouter. В моем случае приложение __init__.py импортировало модуль (точнее, tastypie.api), который в свою очередь (и через длинную цепочку) импортировал django.db.models. Это само по себе неплохо, но models пытается импортировать connection из django.db, и это зависит от ConnectionRouter. Именно здесь и началось наше путешествие. Отсюда и ошибка.

Это описывается как ошибка в django <1.6 здесь: <a href="https://code.djangoproject.com/ticket/20704">https://code.djangoproject.com/ticket/20704 и есть небольшая небольшая ревизия, которая должна была исправить это в django 1.6: https://github.com/django/django/commit/6a6bb168be90594a18ab6d62c994889b7e745055

Однако я решил просто переместить routers.py из каталога приложения в каталог проекта. Никаких неприятных зависимостей там нет.

4 голосов
/ 16 января 2013

Еще одна ошибка, которую следует пропустить, - это импортировать модели в маршрутизатор, это приведет к той же ошибке, даже если маршрутизатор определен в другом файле.

2 голосов
/ 21 декабря 2016

Если у вас есть одно приложение, которое использует несколько баз данных, вы можете маршрутизировать данные для каждого приложения и для каждой таблицы.Например, если ваше приложение «консольное» и вы хотите, чтобы модель «PoolServers» происходила только из другого бэкэнда, вы должны поместить это в свой routers.py

class PoolServerRouter(object): 
def db_for_read(self, model, **hints):
    "Point only reads to poolserver  model to 'hamburger'"
    if model._meta.app_label == 'console' and model._meta.db_table == 'PoolServers':
        return 'hamburger'
    return 'default'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...