2012-05-08 3 views
1

私はDjangoアプリケーションを複数のデータベース用に設定していますが、ストップギャップ対策として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) 

このエラーは、settings.pyに2番目の読み取りデータベースがsepcifiedされたときに発生します。defaultデータベースのみが存在する場合、syncdbコマンドは正常に完了します。

何が原因である可能性がありますか?

編集: Djangoのバージョンは工夫の数時間後に1.2.3

+0

これを解決するには、このような何かに私の​​方法を変更することでしたか? 'post_syncdb'が2回トリガされたようです。 – okm

+0

'DATABASE_ROUTERS = ['path.to.MasterSlaveRouter']'は設定ファイルにあります。 – majackson

+0

OK、実際の 'path.to'を表示し、' MasterSlaveRouter'を設定内に入れて、 'DATABASE_ROUTERS = ['settings.MasterSlaveRouter']'を設定することができますか? – okm

答えて

2

ですが、私はこれが発生した理由があると推定しましたので、いくつかのDjangoの(この場合django.contrib.contenttype.models.ContentTypeではなく、django.contrib.site.models.Site)モデル独自のinbuilt caching mechanismがあります。

同じデータベースに対して2つの異なる接続を設​​定しているため、書き込み接続のContentTypeモデルへの書き込みによって、読み取り専用接続のキャッシュが無効になっていないため、この問題が発生していました。あなたは `DATABASE_ROUTERS`を指定するにはどうすればよい

 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label in ('contenttypes', 'sites'): 
      return 'write' 
     else: 
      return 'read' 
関連する問題