Django多数据库路由

Dar*_*ech 33 python django

我一直在使用手动数据库选择来处理一个有两个单独的数据库的项目.我在设置中定义了我的数据库.经过一些进一步的阅读后,似乎数据库路由实际上就是这样.但是,在阅读了这里的文档和一些相关帖子后,我比以往更加困惑.

在我的设置中,我有:

DATABASES = {
    'default': {
       .... 
    },
    'my_db2': {
       ....
    }
}

DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]
Run Code Online (Sandbox Code Playgroud)

我知道我必须像我这样定义我的路由器类(我认为在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
Run Code Online (Sandbox Code Playgroud)

那又怎样?每个模型是否需要meta.app_label或者是自动的吗?除此之外,我仍然得到一个错误:

django.core.exceptions.ImproperlyConfigured:导入数据库路由器时出错JournalRouter:"无法导入名称连接

谁能帮助我了解正在发生的事情和出了什么问题?任何帮助非常感谢.

Dar*_*ech 29

好的,所以我解决了自己的问题.路由器类进入/ myapp2下名为routers.py的单独文件.不需要meta.app_label,因为我猜它是自动分配的.希望这有助于某人.我还在这里记录了这个过程.

  • 接受你的答案,以便其他人更容易理解这是一个正确的答案. (11认同)

Zak*_*kum 6

没帮我,所以我做了一些调试.也许结果可以为某人带来一些痛苦.:) django 1.4中的问题是当django尝试导入自定义路由器类时发生的循环引用.
这发生在django.db.utils.ConnectionRouter.在我的情况下,应用程序__init__.py导入了一个模块(tastypie.api确切地说),然后导入(并通过长链)django.db.models.也就是说本身并不坏,但models尝试导入connectiondjango.db和碰巧有依赖ConnectionRouter.这正是我们旅程开始的地方.因此错误.

这被描述为django <1.6中的一个错误:https://code.djangoproject.com/ticket/20704并且有一个很好的小变更集应该在django 1.6中修复它:https://github.com/django/django的/提交/ 6a6bb168be90594a18ab6d62c994889b7e745055

然而,我的解决方案是简单地routers.py从app目录移动到项目目录.那里没有讨厌的依赖.