Django 多数据库路由

33 投票
4 回答
30215 浏览
提问于 2025-04-17 05:53

我一直在手动选择数据库来处理一个有两个独立数据库的项目。我已经在设置中定义了我的数据库。

经过进一步的阅读,我发现数据库路由其实是更好的解决方案。不过,看完文档和这里的一些相关帖子后,我更加困惑了。

在我的设置中,我有:

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 个回答

4

还有一个常见的错误是,在路由器中导入模型,这样做会导致同样的错误,即使路由器是在不同的文件中定义的。

6

这对我没有帮助,所以我自己调试了一下。也许这些结果能帮到别人。 :)
在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文件从应用目录移动到项目目录。这样就没有复杂的依赖关系了。

31

好的,我刚刚解决了我自己的问题。路由器类放在一个叫做 routers.py 的单独文件里,位置在 /myapp2 目录下。这里不需要 meta.app_label,因为我想它会自动分配。希望这能帮助到某个人。我还在 这里 记录了这个过程。

撰写回答