2012-12-21 3 views
4

여러 장의 데이터베이스를 사용하기 위해 장고 1.4.3을 설치하려고했지만, 정상적으로 작동하지 않습니다. 나는 SO에 대한 설명서 및 게시물을 읽고 한 다음Django에서 DB 라우터를 사용하는 방법 1.4

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': '/tmp/django.db', 
     'USER': '', 
     'PASSWORD': '', 
     'HOST': '', 
     'PORT': '', 
    }, 
    'db1' : { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'db1', 
     'USER': 'fake', 
     'PASSWORD': 'fake', 
     'HOST': 'fake.host.com', 
     'PORT': '3306', 
    }, 
} 

2)routers.py을 작성하고 정의 다음과 같이

1)settings.py에서 두 번째 DB 구성을 추가 DB 라우터
(참고 : models.py의 DB 라우터를 정의하는 경우 SO 게시물에 따르면, 라우터가 작동하지 않습니다) 다음과 같이

class DBRouter(object): 
    def db_for_read(self, model, **hints): 
     return 'db1' 

    def db_for_write(self, model, **hints): 
     return 'db1' 

    def allow_syncdb(self, db, model): 
     return 'db1' 

3)settings.py
(주 다음 줄을 추가합니다 : SO 게시물에 따르면,이 라인이 잘못했다 DATABASES 구성

from django.db import connections 
DATABASE_ROUTERS = ['fakeproject.routers.DBRouter',] 

이후 여야합니다.
은 분명히, 내 모든 통화는 기본 DB를 통해 라우팅 : 그것은

내 증상을 등록 할 라우터를 방지 여기 from django.db import connections을 넣어하지 마십시오.

  • 두 DB 설정 작업 (I 성공적으로

  • DATABASE_ROUTERS 설정은 심지어 비 DB를 라우터에 잘못된 경로를 넣어, 또는 경우 (모든 불평 생성하지 않습니다 manage.py indpectdb --database db1을 수행 할 수 있습니다 자세한 내용은 아래 문자열 실제로 그것을 반복하려고 할 때, 나는 no such table에게있어

    내가 MyModel.objects.all()을 할 수 manage.py shell를 통해 내 개체에 액세스하려고
  • 하지만. 기본값은 DB가 해당 테이블이없는 개체),하지만 'DB1' 내가 모델을 생성했을 때 분명히 가지고있다. 그것에 inspectdb를 사용하여. DB 구성을 db1default 사이에 바꿔 넣으면 문제없이 개체에 액세스 할 수 있습니다.

매우 도움이 되었습니까?

답변

2

3 단계의 진술 문 "from django.db import connections "이 (가) DB 라우터를 등록하지 못하게한다는 것을 알았습니다. 이 문장을 삭제하면 라우터가 등록되어 예상대로 작동하기 시작했습니다.

1

나는 당신의 routers.py'db1'에 대한 참조를 반환하기 때문에 문제가 아마도 발생 생각하지만 당신은 단지 'default'로 연결되고있어 말한대로 나는 그것을 유일한 'db1'로 라우팅 기대 (확실 해요.

routers.py에서 마스터 라우터 클래스를 만든 다음 각 DB에 대해 하위 클래스로 만들고 app_label 문자열로 초기화하여 서로 구분할 수 있도록하십시오.

class MasterRouter(object): 
    def __init__(self, app_label): 
     super(MasterRouter, self).__init__() 
     self.app_label = app_label 

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

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

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

    def allow_syncdb(self, db, model): 
     if db == 'default': 
      return model._meta.app_label == self.app_label 
     elif model._meta.app_label == self.app_label: 
      return False 
     return None 

class DefaultRouter(MasterRouter): 
    def __init__(self): 
     super(DefaultRouter, self).__init__('default') 

class DB1Router(MasterRouter): 
    def __init__(self): 
     super(DB1Router, self).__init__('db1') 

다음에

settings.py는 라우터가

DATABASE_ROUTERS = [ 'routers.DefaultRouter', 'routers.DB1Router' ] 

당연히, 당신은 아마 다르게 MasterRouter 클래스의 재정의를 설정하는 것이 좋습니다 선언합니다.

+0

답변 해 주셔서 감사합니다. 그 사이에 서브 클래스를 갖는 것이 왜 문제를 해결할 수 있습니까? –

+0

'DATABASE_ROUTERS'에 두 개의 클래스가 필요합니다 - 각 DB에 하나씩. 저는 DRY 코드를 선호하기 때문에 하위 클래스로 분류됩니다 (두 클래스로 다시 작성할 수 있지만 코드는 거의 동일합니다). – danodonovan

관련 문제