我一直在尝试设置Django 1.4.3使用多个数据库,但是我无论如何都不能使其正常工作。我阅读了文档和SO上的帖子,并执行了以下操作:
1) 在settings.py
中添加第二个DB配置,如下所示:
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
文件,并定义一个数据库路由如下
(注意:根据 Stack Overflow 上的帖子,如果您在 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
,因为它会导致路由器无法注册。
我的症状:
显然,我所有的调用都通过默认数据库路由。以下是详细信息:
两个数据库设置都可以工作(我可以成功执行
manage.py indpectdb --database db1
)。DATABASE_ROUTERS
设置没有产生任何投诉(即使我将错误的路径放入DB路由器中,或者甚至放入非字符串对象)。当我尝试通过
manage.py shell
访问我的对象时,我可以使用MyModel.objects.all()
,但是当我实际尝试迭代它时,我被告知no such table
。默认数据库没有那个表,但是'db1'显然有它,因为我是通过在它上面使用inspectdb
生成模型的。证明如下,如果我在db1
和default
之间交换DB配置,我可以毫无问题地访问对象。
非常感谢任何帮助!
DATABASE_ROUTERS
中,您需要两个类 - 每个数据库一个。我正在子类化,因为我喜欢DRY代码(您可以重写为两个类,但代码几乎相同)。 - danodonovan