Django多数据库路由 [英] Django multi-database routing

查看:84
本文介绍了Django多数据库路由的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用手动数据库选择来处理具有两个单独的dbs的项目。我已经在设置中定义了我的数据库。经过进一步的阅读,似乎数据库路由实际上是这样的方式。然而,在阅读文档和一些相关的帖子后,我比以往任何时候都更加困惑。



在我的设置中,我有:

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

DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]

我知道我必须在myapp2.models.py中定义我的路由器类(我认为):

  class MyDB2Router(object):
一个用于控制
中的所有数据库操作的路由器myapp2应用程序

def db_for_read(self,model,** hints):
if model._meta.app_label =='myapp2':
return'my_db2'
return无

def db_for_write(self,model,** hints):
if model._meta.app_label =='myapp2':
return'my_db2'
return无

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):

如果db =='my_db2':
返回model._meta.app_label =='myapp2'
elif model._meta.app_label =='myapp2':
return False
return无

那么什么?每个模型是否需要一个meta.app_label或是自动的?
除此之外,我仍然收到一个错误:



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

任何人都可以帮助我了解发生了什么,出现什么问题?任何帮助都非常感谢。

解决方案

好的,所以我刚刚解决了自己的问题,路由器类进入一个名为router.py的单独的文件,位于 / myapp2 之下,否 meta.app_label 是必需的,因为我想它是自动分配的,希望这有助于我。我还记录了过程 here


I have been using manual db selection to cope with a project which has two seperate dbs. I have defined my databases in the settings. After some further reading it seems that database routing is actually the way to go with this. However, after reading the docs and some relevant posts here I am more confused than ever.

In my settings I have:

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

DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]

I know I have to define my router class (I think in myapp2.models.py) like so:

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

Then what? Does each model require a meta.app_label or is that automatic? Aside from that, I still get an error:

django.core.exceptions.ImproperlyConfigured: Error importing database router JournalRouter: "cannot import name connection

Can anyone help me understand what is happening and what is going wrong? Any help much appreciated.

解决方案

OK, so I just solved my own problem. The router class goes into a separate file called routers.py under /myapp2. No meta.app_label is required as I guess it is automatically assigned. Hope this helps someone. I have also documented the process here.

这篇关于Django多数据库路由的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆