複数の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構成を交換するdb1
とdefault
、問題なくオブジェクトにアクセスできます。
どんな助けでも大歓迎です!