4

複数のDBを使用するようにDjango1.4.3をセットアップしようとしていますが、私の人生ではそれを機能させることができません。SOに関するドキュメントと投稿を読み、次のことを行いました。

1)次のように、に2番目のDB構成を追加settings.pyします。

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次のようにDBルーターを定義します
(注:SOの投稿によると、でDBルーターを定義するmodels.pyと、ルーターは機能しません)

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',]

これは間違っていました。from django.db import connectionsルーターの登録を妨げるため、ここに入れないでください

私の症状:
どうやら、私のすべての通話はデフォルトのDBを経由してルーティングされます。以下の詳細:

  • 両方のDB設定が機能します(manage.py indpectdb --database db1正常 に実行できます

  • DATABASE_ROUTERS設定しても文句は生成されません(DBルーターへのパスを間違えた場合や文字列以外のオブジェクトを入力した場合でも)

  • を介してオブジェクトにアクセスしようとするとmanage.py shell実行できますMyModel.objects.all()が、実際に反復しようとすると、と言われno such tableます。デフォルトのDBにはそのテーブルがありませんが、それを使用inspectdbしてモデルを生成したので、「db1」には明らかにテーブルがあります。証拠として、との間でDB構成を交換するdb1default、問題なくオブジェクトにアクセスできます。

どんな助けでも大歓迎です!

4

2 に答える 2

3

from django.db import connections 手順3" "のステートメントがDBルーターの登録を妨げていることがわかりました。このステートメントを削除すると、ルーターが登録され、期待どおりに動作し始めました。

于 2012-12-21T22:59:45.783 に答える
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もちろん、クラスのオーバーライドを別の方法で設定することをお勧めします。

于 2012-12-21T13:43:24.923 に答える