Django - 运行时数据库切换

时间:2015-05-13 23:02:28

标签: django django-models django-database django-middleware django-managers

在我的工作中,我们希望运行具有多个数据库的服务器。当您访问http://myapp.webpage.comhttp://other.webpage.com等网址时,应进行数据库切换。我们只想运行一个服务器实例,并在HTTP请求时切换数据库并返回相应的响应。

我们一直在寻找一个可持续的和Django友好的'解。在我们的调查中,我们发现了可能的方法,但我们没有足够的信息。

选项1:Django中间件

每次服务器收到HTTP请求时都会运行django中间件。

  1. 在这里进行数据库切换可能是最好的选择,但据我所知,仅使用django database routers只允许更改模型或组或模型的数据库。

  2. 另一种选择是在中间件中设置django model manager实例,并强制所有模型从自定义中间件中添加的属性重新分配objects属性。

    < / LI>
  3. 我的最后一个选择是在中间件收到的请求对象中创建一个新属性,该对象从database alias返回settings.py,并在每个模型查询中使用using method

  4. 选项2:基于类的View Mixin

    创建一个使用过去三个选项的mixin,但我必须在所有基于类的视图中设置mixin 。如果程序员忘记设置mixin并且它来到生产服务器,那么数据可能(或不再存在)在正确的数据库中,我也不想承担风险。

    选项3:在运行时更改数据库设置

    此选项有效但Is not recommended并且风险太大。

    更新:

    这是如何运作的?

    middlewares.py

    import django.conf as conf
    import os.path
    
    
    class SelectDB(object):
    
        def process_request(self, request):
            print request.META['HTTP_REFERER']
            file_database = open("booklog/database.txt", "r")
            database = file_database.read(10)
            file_database.close()
            if database != 'default':
                conf.settings.DATABASES['default']['NAME'] = database
    

    非常感谢任何有助于我们解决的信息。

1 个答案:

答案 0 :(得分:3)

答案(对我有用)

问题已经回答here, in stackoverflow。我喜欢这个功能在django。找到实现这一目标的方法有点困难。

我认为评论Wilduck使用django插件django-dynamic-db-router所做的出色工作非常重要,这是一个很棒的插件,可以(以某种方式)以不同的方式实现此操作。

非常感谢@JL Peyret和@ire_and_curses。

作为@ire_and_curses的答案。至少在这一刻,在项目中,我正在努力,这就是我们所需要的。在以前的项目中,我们需要一个类似的行为,并且每个实例使一台服务器变得非常糟糕,并且更新每台服务器,甚至使该过程自动化。