【发布时间】:2012-12-21 10:33:08
【问题描述】:
我一直在尝试将 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 并定义一个数据库路由器,如下所示
(注意:根据SO帖子,如果您在models.py中定义了一个DB路由器,路由器将不起作用)
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 db1DATABASE_ROUTERS设置不会产生任何抱怨(即使我输入了错误的 DB 路由器路径,甚至是非字符串对象)当我尝试通过
manage.py shell访问我的对象时,我可以执行MyModel.objects.all(),但是当我实际尝试迭代它时,我被告知no such table。默认数据库没有那个表,但是当我使用inspectdb生成模型时,'db1' 显然有它。作为证明,如果我在db1和default之间交换数据库配置,我可以毫无问题地访问该对象。
非常感谢任何帮助!
【问题讨论】:
标签: python django multiple-databases