Django 多数据库路由
我一直在手动选择数据库来处理一个有两个独立数据库的项目。我已经在设置中定义了我的数据库。
经过进一步的阅读,我发现数据库路由其实是更好的解决方案。不过,看完文档和这里的一些相关帖子后,我更加困惑了。
在我的设置中,我有:
DATABASES = {
'default': {
....
},
'my_db2': {
....
}
}
DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]
我知道我需要定义我的路由器类(我觉得是在myapp2.models.py
文件中),像这样:
class MyDB2Router(object):
"""A router to control all database operations on models in
the myapp2 application"""
def db_for_read(self, model, **hints):
if model._meta.app_label == 'myapp2':
return 'my_db2'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'myapp2':
return 'my_db2'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'myapp2' or obj2._meta.app_label == 'myapp2':
return True
return None
def allow_syncdb(self, db, model):
if db == 'my_db2':
return model._meta.app_label == 'myapp2'
elif model._meta.app_label == 'myapp2':
return False
return None
然后呢?每个模型都需要一个meta.app_label
吗,还是说这是自动的?除此之外,我还是遇到了一个错误:
django.core.exceptions.ImproperlyConfigured: 导入数据库时出错 路由器 JournalRouter: "无法导入名称 connection
有没有人能帮我理解发生了什么,以及哪里出错了?非常感谢任何帮助。
4 个回答
还有一个常见的错误是,在路由器中导入模型,这样做会导致同样的错误,即使路由器是在不同的文件中定义的。
这对我没有帮助,所以我自己调试了一下。也许这些结果能帮到别人。 :)
在django 1.4中,出现了一个循环引用的问题,这个问题发生在django试图导入自定义路由类的时候。
具体来说,这个问题出现在django.db.utils.ConnectionRouter
。在我的案例中,应用的__init__.py
文件导入了一个模块(准确来说是tastypie.api
),而这个模块又通过一系列的导入最终导入了django.db.models
。这本身并没有问题,但models
又试图从django.db
中导入connection
,而这个connection
恰好依赖于ConnectionRouter
。这正是我们问题的起点,因此就出现了错误。
这个问题在django 1.6之前被描述为一个bug,具体可以查看这里:https://code.djangoproject.com/ticket/20704,而在django 1.6中有一个小的更新应该修复了这个问题:https://github.com/django/django/commit/6a6bb168be90594a18ab6d62c994889b7e745055
不过,我的解决办法是把routers.py
文件从应用目录移动到项目目录。这样就没有复杂的依赖关系了。
好的,我刚刚解决了我自己的问题。路由器类放在一个叫做 routers.py 的单独文件里,位置在 /myapp2 目录下。这里不需要 meta.app_label,因为我想它会自动分配。希望这能帮助到某个人。我还在 这里 记录了这个过程。