【问题标题】:multiple databases and multiple models in djangodjango中的多个数据库和多个模型
【发布时间】:2013-09-04 01:01:35
【问题描述】:

我有两个数据库和两个模型:管理员和用户。

我想将我的模型同步到两个数据库; 管理模型到数据库 A,用户模型到数据库 B;

如果我将模型路径设置为INSTALLED_APPSsyncdb,这两个模型将同步到默认数据库。

如果我在syncdb命令中设置数据库如sync --database="B",两个模型会同步到数据库B。

所以我的问题是,如何将两个模型同步到两个数据库?

【问题讨论】:

  • @alecxe - 不是 OP,但你解决了我的问题 :)

标签: python database django django-models


【解决方案1】:

为了定义用于特定模型的特定数据库,您需要定义一个database router

使用多个数据库最简单的方法是建立一个数据库 路由方案。默认路由方案确保对象保持不变 “粘”到他们的原始数据库(即,从 foo 数据库将保存在同一个数据库中)。默认 路由方案确保如果未指定数据库,所有查询 回退到默认数据库。

以这个 sn-p 为例:http://djangosnippets.org/snippets/2687/

另见:

【讨论】:

  • alecxe,thx, 但是 app_label 是什么?我应该在 django 模型中设置 app_label 吗?
  • 这并不重要,这取决于您将如何实现您的路由器。仅供参考,有一个 example in django docs 显示如何使用 app_label 进行路由。
  • thenewcircle.com/s/post/1242/django_multiple_database_support 中,它给出:if model._meta.app_label == 'chinook': return 'chinookdb' 所以如果我想要一个模型在 chinookdb 上操作,我应该添加一个 app_label在元中,对吧?
  • @young001 是的,如果您按照本文中的说明进行操作。
  • @young001,您绝对不需要在模型的元类中声明 app_labels --- 如果模型是在您的应用程序目录中定义的,而不是在外部定义的。正如您所描述的,我刚刚实现了两个带有路由器的数据库,它们在没有显式声明的情况下在 Django 1.8 中工作。下面 Adam Lewis 提供的示例与此不矛盾,而是一种不同的方法,涉及覆盖应用程序名称作为 app_label 的默认使用,以便不仅避免重复的路由器,而且可能为指定的两个或多个应用程序使用一个数据库.
【解决方案2】:

我完全同意@alecxe 关于使用数据库路由器的观点。我目前正在使用单个管理界面来管理多个数据库。请注意,所有数据库的身份验证都存储在默认数据库中,因此当您执行 syncdb(不带参数)时。

通用数据库路由器

我发现this 实现非常灵活和有用。

Settings.py

# Define the database manager to setup the various projects
DATABASE_ROUTERS = ['manager.router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'mux_data': 't29_db', 
                         'T50_VATC':'t50_db'}

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', 
            'NAME': 'fail_over',                    
            'USER': 'SomeUser',                      
            'PASSWORD': 'SomePassword',                  
            'HOST': '127.0.0.1',                     
            'PORT': '',                      
    },

    't29_db': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', 
            'NAME': 'mux_stage',                    
            'USER': 'SomeUser',                      
            'PASSWORD': 'SomePassword',                  
            'HOST': '127.0.0.1',                      
            'PORT': '',                      
    },

    't50_db': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', 
            'NAME': 't50_vatc',                    
            'USER': 'SomeUser',                      
            'PASSWORD': 'SomePassword',                 
            'HOST': '127.0.0.1',                     
            'PORT': '',                      
    },
}

示例模型

# Create your models here.
class Card_Test(models.Model):
    name = models.TextField(max_length=100)
    description = models.TextField(max_length=200)
    units = models.TextField(max_length=500)
    result_tags = models.TextField(max_length=500)

    class Meta:
        app_label = 'mux_data'

    def __unicode__(self):
        return self.name

class Status_Type(models.Model):
    status = models.CharField(max_length=25)

    class Meta:
        app_label = 'mux_data'

    def __unicode__(self):
        return self.status

【讨论】:

  • 在定义的两个模型中,您都将 app_label 设置为“mux_data”。是否有意表明这两个模型都将进入数据库 t29_db?因此,如果任何其他模型有 app_label 'T50_VATC',它将被保存在 db t50_db 中。
  • @VikasNehaOjha 是的,这是故意的。这是为了表明每个模型都可以控制其数据的存储位置。
  • DatabaseAppsRouter 类应该在哪里?它应该导入什么?
  • 截至今天,链接已断开,答案无效。您应该将代码直接添加到答案中,否则它不再是答案。
猜你喜欢
  • 2013-04-25
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多