我一直在尝试将 Django 1.4.3 设置为使用多个数据库,但对于我的生活,我无法让它工作。我阅读了关于 SO 的文档和帖子,并执行了以下操作:
1)在 中添加第二个 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
这里,因为它会阻止路由器注册
我的症状:
显然,我所有的呼叫都是通过默认数据库路由的。详情如下:
两种数据库设置都有效(我可以
manage.py indpectdb --database db1
成功 执行DATABASE_ROUTERS
设置不会产生任何抱怨(即使我将错误的路径放入 DB 路由器,甚至是非字符串对象)当我尝试通过 访问我的对象时
manage.py shell
,我可以这样做,MyModel.objects.all()
但是当我实际尝试迭代它时,我被告知no such table
. 默认数据库没有那个表,但是当我使用它生成模型时,'db1' 显然有inspectdb
它。作为证明,如果我在db1
和之间交换数据库配置default
,我可以毫无问题地访问该对象。
任何帮助都非常感谢!