Django 1.2中的多数据库配置

时间:2010-09-03 15:50:17

标签: python django django-models

希望这是一个简单的问题。

我在理解Django 1.2中新的多数据库功能的文档时遇到了一些麻烦。首先,我似乎无法找到一个如何在你的一个模型中实际使用第二个数据库的例子。

当我在models.py中定义一个新类时,如何指定我打算连接的数据库?

我的settings.py包含类似于 -

的内容
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'modules',
        'USER': 'xxx',                      
        'PASSWORD': 'xxx',                  
    },
    'asterisk': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'users',                     
        'USER': 'xxxx',                      
        'PASSWORD': 'xxxx',                  
    }

}

编辑:我正在阅读像虚拟机这样的路由器上的文档。如果其他人正在努力解决这个问题,请确保在放弃之前阅读它2到3次!

3 个答案:

答案 0 :(得分:25)

是的,它有点复杂。

您可以通过多种方式实施它。基本上,您需要某种方式来指示哪些模型与哪个数据库相关联。

第一个选项

这是我使用的代码;希望它有所帮助。

from django.db import connections

class DBRouter(object):
    """A router to control all database operations on models in
    the contrib.auth application"""

    def db_for_read(self, model, **hints):
        m = model.__module__.split('.')
        try:
            d = m[-1]
            if d in connections:
                return d
        except IndexError:
            pass
        return None

    def db_for_write(self, model, **hints):
        m = model.__module__.split('.')
        try:
            d = m[-1]
            if d in connections:
                return d
        except IndexError:
            pass
        return None

    def allow_syncdb(self, db, model):
        "Make sure syncdb doesn't run on anything but default"
        if model._meta.app_label == 'myapp':
            return False
        elif db == 'default':
            return True
        return None

这样做的方法是我创建一个文件,其中包含要使用的数据库名称,用于保存我的模型。在您的情况下,您将创建一个名为models的单独asterisk.py样式文件,该文件与您应用的模型位于同一文件夹中。

models.py文件中,您需要添加

from asterisk import *

然后,当您实际从该模型请求记录时,它的工作方式如下:

  1. records = MyModel.object.all()
  2. MyModel的模块为myapp.asterisk
  3. 有一个名为“星号”的连接,所以请使用 它而不是“默认”
  4. 第二个选项

    如果你想对每个模型的数据库选择进行控制,那么这样的事情就可以了:

    from django.db import connections
    
    class DBRouter(object):
        """A router to control all database operations on models in
        the contrib.auth application"""
    
        def db_for_read(self, model, **hints):
            if hasattr(model,'connection_name'):
                return model.connection_name
            return None
    
        def db_for_write(self, model, **hints):
            if hasattr(model,'connection_name'):
                return model.connection_name
            return None
    
        def allow_syncdb(self, db, model):
            if hasattr(model,'connection_name'):
                return model.connection_name
            return None
    

    然后为每个模型:

    class MyModel(models.Model):
        connection_name="asterisk"
        #etc...
    

    请注意,我没有测试过第二个选项。

答案 1 :(得分:8)

Jordans的补遗回答如上。对于第二个选项,allow_syncdb方法可以正常工作,如下所示:

def allow_syncdb(self, db, model):
    if hasattr(model,'connection_name'):
        return model.connection_name == db
    return db == 'default'

答案 2 :(得分:3)