其他分享
首页 > 其他分享> > 如何在Django 1.4中使用DB路由器

如何在Django 1.4中使用DB路由器

作者:互联网

我一直在尝试将Django 1.4.3设置为使用多个DB,但对于我的生活,我无法让它工作.我阅读了SO上的文档和帖子,并做了以下事情:

1)在settings.py中添加第二个数据库配置,如下所示:

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并定义一个DB路由器,如下所示
(注意:根据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',]

这是错的.不要在这里放置django.db导入连接,因为它会阻止路由器注册

我的症状:
显然,我的所有呼叫都是通过默认数据库路由的.详情如下:

>两个数据库设置都有效(我可以成功执行manage.py indpectdb –database db1)
> DATABASE_ROUTERS设置不会产生任何抱怨(即使我把错误的路径放到数据库路由器,甚至是非字符串对象)
>当我尝试通过manage.py shell访问我的对象时,我可以执行MyModel.objects.all()但是当我实际尝试迭代它时,我被告知没有这样的表.默认DB没有该表,但是’db1’显然有它,因为我使用了inspectdb生成了模型.作为证明,如果我在db1和default之间交换数据库配置,我可以毫无问题地访问该对象.

任何帮助高度赞赏!

解决方法:

我发现第3步中的语句“来自django.db导入连接
“阻止了DB路由器的注册.当我删除这个语句时,路由器已经注册,并且东西开始按预期工作.

标签:python,django,multiple-databases
来源: https://codeday.me/bug/20190625/1286782.html