web-dev-qa-db-ja.com

djangoの複数のデータベースと複数のモデル

管理者とユーザーという2つのデータベースと2つのモデルがあります。

モデルを2つのデータベースに同期させたい。データベースAへの管理モデルとデータベースBへのユーザーモデル。

モデルパスをINSTALLED_APPSおよびsyncdbに設定している場合、2つのモデルはデフォルトのデータベースに同期します。

sync --database="B"などのsyncdbコマンドでデータベースを設定すると、2つのモデルはデータベースBに同期します。

だから私の問題は、2つのモデルを2つのデータベースにどのように同期させるのですか?

23
young001

データベースルーターの使用については、@ 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
26
Adam Lewis

特定のモデルに使用される特定のデータベースを定義するには、 データベースルーター を定義する必要があります。

複数のデータベースを使用する最も簡単な方法は、データベースルーティングスキームを設定することです。デフォルトのルーティングスキームは、オブジェクトが元のデータベースに「スティッキー」のままであることを保証します(つまり、fooデータベースから取得したオブジェクトは同じデータベースに保存されます)。デフォルトのルーティングスキームでは、データベースが指定されていない場合、すべてのクエリがデフォルトのデータベースにフォールバックします。

例としてこのスニペットを参照してください: http://djangosnippets.org/snippets/2687/

こちらもご覧ください:

18
alecxe