【问题标题】:Multiple Database Config in Django 1.2Django 1.2 中的多个数据库配置
【发布时间】:2011-04-24 05:16:02
【问题描述】:

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

我在理解 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 遍!

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    是的,有点复杂。

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

    第一个选项

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

    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
    

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

    在您的 models.py 文件中,您将添加

    from asterisk import *
    

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

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

    第二个选项

    如果您想对数据库选择进行每个模型的控制,可以使用以下方法:

    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...
    

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

    【讨论】:

    • 很抱歉延迟回复,但这非常有帮助!
    • 您好,我已经实现了您的第二个选项。除了allow_syncdb,它工作得很好。我将在下面发布一个带有工作 allow_syncdb 的答案,供任何未来的搜索者使用。
    • 谢谢!我有一段时间试图从 django 文档中了解这一点。
    【解决方案2】:

    上面乔丹回答的附录。对于第二个选项,allow_syncdb 方法正常工作如下:

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

    【讨论】:

    • 有趣!所以你在模型中设置connection_name?
    • 是的。它工作得相当好,除了我必须指定“通过”模型的多对多字段,否则 Django 在默认数据库中生成“通过”表。
    • 哇!我一定会在心里记下这一点。干得好,丰富。
    【解决方案3】:

    automatic database routingmanually selecting a database 上的文档没有帮助吗?

    【讨论】:

    • 我可能遗漏了一些东西,但据我所知,除了默认数据库之外,没有任何示例说明如何使用任何东西定义模型。
    • +1。 Django 有很好的文档,而且文档几乎总是首先要查看的地方。
    • "Django 有好的文档吗?"我没有发现这种情况经常发生。通常,当我需要了解某些内容时,我最终会查看源代码,无论是在本地托管还是在 djangoapi.quamquam.org/trunk
    猜你喜欢
    • 2011-11-21
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多