2017-07-01 15 views
4

午後。私は話題に関する数多くの場所を読んでいて、それぞれの情報を一貫しているとは限りません。これはテストの設定なので、私は何かが動作していないことを見つけるために数か月を要したくありません---そしてこれに至ることが分かります。Django複数のデータベース(健全性チェック)

これ以上の経験を積んだ人には感謝し、何か提案をしてください。 (メインspiderprojectフォルダ内)

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.postgresql_psycopg2', 
    'NAME': 'myproject', 
    'USER': 'myprojectuser', 
    'PASSWORD': 'abc123', 
    'HOST': 'localhost', 
    'PORT': '', 
}, 
'ta1_db': { 
    'ENGINE': 'django.db.backends.postgresql_psycopg2', 
    'NAME': 'testapp1db', 
    'USER': 'ta1', 
    'PASSWORD': 'ta1', 
    'HOST': 'localhost', 
    'PORT': '', 
}, 
'ta2_db': { 
    'ENGINE': 'django.db.backends.postgresql_psycopg2', 
    'NAME': 'testapp2db', 
    'USER': 'ta2', 
    'PASSWORD': 'ta2', 
    'HOST': 'localhost', 
    'PORT': '', 
}, 
} 

DATABASE_ROUTERS = ['spiderproject.routers.DBRouter',] 

routers.py

settings.py

class DBRouter(object): 

def db_for_read(self, model, **hints): 
    """Send all read operations on 'app_label' app models to associated db""" 
    if model._meta.app_label == 'testapp1': 
     return 'ta1_db' 
    if model._meta.app_label == 'testapp2': 
     return 'ta2_db' 
    return None 

def db_for_write(self, model, **hints): 
    """Send all write operations on 'app_label' app models to associated db""" 
    if model._meta.app_label == 'testapp1': 
     return 'ta1_db' 
    if model._meta.app_label == 'testapp2': 
     return 'ta2_db' 
    return None 

def allow_relation(self, obj1, obj2, **hints): 
    """Determine if relationship is allowed between two objects.""" 

    # Allow any relation between two models that are in the same app. 
    if obj1._meta.app_label == 'testapp1' and obj2._meta.app_label == 'testapp1': 
     return True 
    if obj1._meta.app_label == 'testapp2' and obj2._meta.app_label == 'testapp2': 
     return True 
    # No opinion if neither object is in the Example app (defer to default or other routers). 
    elif 'testapp1' not in [obj1._meta.app_label, obj2._meta.app_label] and 'testapp2' not in [obj1._meta.app_label, obj2._meta.app_label]: 
     return None 

    # Block relationship if one object is in the Example app and the other isn't. 
     return False 

def allow_migrate(self, db, app_label, model_name=None, **hints): 
    """Ensure that the 'app_label' app's models get created on the right database.""" 
    if app_label == 'testapp1': 
     return db == 'ta1_db' 
    if app_label == 'testapp2': 
     return db == 'ta2_db' 
    elif db == 'default': 
     # Ensure that all other apps don't get migrated on the example_db database.??? 
     return False 

    # No opinion for all other scenarios 
    return None 

(allow_migrate中のelif()私が正しいかはわからない。allow_relationでもelifの()。私はこれらの例を適用しました)

私はtestapのモデルを登録しましたp1とtestapp2を自分のadmin.pyに入れて管理ページに表示します。この時点でデータの追加/削除は正常です。

事前に感謝します。

+0

あなたのご意見は?共通のものは、単一のスキーマの複数のコピーを格納することである。それぞれが独自の独立したストレージを持つ複数のクライアントをサポートします。それがあなたの目標なら、あなたは['django-tenants'](https://github.com/tomturner/django-tenants)のようなものを考えるかもしれません。 – Chris

+0

私は自分のDjango/gunicorn/nginxサイトをホストしていますが、Lightroomデータベース(sqlite3、読み取り専用 - 私はこれを文書化するかもしれません)ベースのアプリケーションをホストする必要から、単一のプロジェクトが生成されています。私の意図は、サイトを変更し、単一のプロジェクト構造を維持し、異なるもの(別々のLrを追加)用に別々のアプリケーションを用意することです。私はそれが複数のプロジェクトを持っている可能性があり、それらをルーティングするためにnginxを使用するが、私は各サイト(非常に低いクライアント数)のアプリを使用したい。私が気に入っているさまざまなdb型があるかもしれません。Postgresは例として使用されています。 – Rasta

答えて

1

ここに私の推奨ルータがあります。以下のコメントの説明


class DBRouter(object): 
    def db_for_read(self, model, **hints): 
     """Send all read operations on 'app_label' app models to associated db""" 
     if model._meta.app_label == 'testapp1': 
      return 'ta1_db' 
     if model._meta.app_label == 'testapp2': 
      return 'ta2_db' 
     # return None 
      # I recommend returning 'default' here since # it is your default database return 'default' 

    def db_for_write(self, model, **hints): 
     """Send all write operations on 'app_label' app models to associated db""" 
     if model._meta.app_label == 'testapp1': 
      return 'ta1_db' 
     if model._meta.app_label == 'testapp2': 
      return 'ta2_db' 
     # return None 
      # I recommend returning 'default' here since # it is your default database, this will allow # commonly used django apps to create their # models in the default database (like contenttypes # and django auth return 'default' 

    def allow_relation(self, obj1, obj2, **hints): 
     """Determine if relationship is allowed between two objects.""" 

     # Allow any relation between two models that are in the same app. 
     # I prefer to make this global by using the following syntax 
     return obj1._meta.app_label == obj2._meta.app_label 


    def allow_migrate(self, db, app_label, model_name=None, **hints): 
      # I think this was your biggest misunderstanding # the db_for_write will pick the correct DB for the migration # allow_migrate will only let you say which apps/dbs you # should not migrate. I *strongly* recommend not taking # the belt and braces approach that you had here. return True 

+0

入力いただきありがとうございます。私はVMをスナップショットして、これをmoで試してみます。私はそれを試す前に言わなければならない、それははるかに論理的に見えます。 – Rasta

+0

うまくいきました、ありがとうございました。 – Rasta

関連する問題