2012-05-08 3 views
1

여러 데이터베이스에 대해 Django 응용 프로그램을 구성하는 중이고 stop-gap 측정으로 settings.py에서 다음 구성을 사용하고 있습니다. :여러 데이터베이스가 지정된 경우 Django syncdb 중복 행을 삽입하려고합니다

READ_DATABASE = { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'thedatabase', 
    'USER': 'read_only', 
    'PASSWORD': '', 
    'OPTIONS': { 
     'init_command': 'SET storage_engine=INNODB' 
    } 
} 

WRITE_DATABASE = { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'thedatabase', 
    'USER': 'root', 
    'PASSWORD': '', 
    'OPTIONS': { 
     'init_command': 'SET storage_engine=INNODB' 
    } 
} 

DATABASES = {'default': WRITE_DATABASE, 
      'read': READ_DATABASE} 

마스터 - 슬레이브 쌍을 에뮬레이트하기 위해 동일한 데이터베이스를 가리 킵니다. 추측 하듯이 read_only 사용자에게는 읽기 권한 만 있습니다.

내 데이터베이스 라우터는 다음과 같습니다 : 실행하지 못한 것

django.db.utils.IntegrityError: (1062, "Duplicate entry 'auth-permission' for key 'app_label'") 

기분을 상하게 SQL : syncdb를 실행하는 경우

from django.conf import settings 

class MasterSlaveRouter(object): 

    def db_for_read(self, model, **hints): 
     return 'read' 

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

    def allow_relation(self, db1, db2, **hints): 
     return True 

    def allow_syncdb(self, db, model): 
     return db in ('default',) 

, 지금 오류와 함께, 슈퍼 유저를 설정 한 후 즉시 충돌 is :

INSERT INTO `django_content_type` (`name`, `app_label`, `model`) VALUES (permission, auth, permission) 

이 오류 default 데이터베이스가있을 때 두 번째 읽기 데이터베이스가 내 settings.py에 sepcified 때 발생합니다. syncdb 명령이 성공적으로 완료됩니다.

어떤 원인 일 수 있습니까?

편집 : 장고 버전은 땜질 몇 시간 후 1.2.3

+0

:

이에 대한 해결책은 다음과 같이 내 db_for_read 방법을 변경했다? 'post_syncdb'가 두 번 트리거 된 것처럼 보입니다. – okm

+0

'DATABASE_ROUTERS = [ 'path.to.MasterSlaveRouter']'는 설정 파일에 있습니다. – majackson

+0

OK, 실제'path.to'를 보여줄 수 있고,'MasterSlaveRouter'를 설정에 넣고'DATABASE_ROUTERS = [ 'settings.MasterSlaveRouter']'를 설정하려고 할 수 있습니까? – okm

답변

2

, 난이 발생 된 이유는 추론 한 때문에 일부 장고 (이 경우 django.contrib.contenttype.models.ContentType에서뿐만 아니라 django.contrib.site.models.Site) 모델 자신의 inbuilt caching mechanism 있습니다.

동일한 데이터베이스에 대해 서로 다른 두 개의 연결을 설정했기 때문에 쓰기 연결에서 ContentType 모델에 대한 쓰기로 인해 읽기 전용 연결에 대한 contenttype 캐시가 무효화되지 않았기 때문에 문제가 발생했습니다. 당신은`DATABASE_ROUTERS`를 지정하려면 어떻게

 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label in ('contenttypes', 'sites'): 
      return 'write' 
     else: 
      return 'read' 
관련 문제