まず、アクセス対象のデータベースを settings.py に記載する。
ここでは、通常(default)のデータベースと、特定のアプリケーションで利用するデータベース(nextdb)を定義した。
なお、以下の例では特定のアプリケーションを app としている。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'nextdb': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'nextdb.sqlite3'), } }次に、データベースの切り替え条件を定義したルータの情報を記載する。なお、ここでは、project/router.py として作成する。
class Router(object): def db_for_read(self, model, **hints): if model._meta.app_label == "app": return "nextdb" return None def db_for_write(self, model, **hints): if model._meta.app_label == "app": return "nextdb" return None def allow_relation(self, obj1, obj2, **hints): if obj1._meta.app_label == "app" and obj2._meta.app_label == "app": return True elif "app" not in [obj1._meta.app_label, obj2._meta.app_label]: return True return None def allow_migrate(self, db, app_label, model=None, **hints): if app_label == "app": return db == "nextdb" else: return db == "default"db_for_read および db_for_write は、与えられた model のアクセス先データベースを返す関数である。なお、戻り値が None の場合は、DATABASES の default で定義したデータベースが採用される。
allow_relation は、外部キーなどの設定の際、オブジェクト間でのリレーション可否を判定するための関数である。また、allow_migrate は、該当モデルとデータベースとの同期可否を定義する。
上記のすべての関数を定義する必要はなく、必要なものを定義することになる。
最後に settings.py にルータ情報を登録する。
DATABASE_ROUTERS = ['router.Router']例として、appアプリケーションのモデル(app/model.py)と、その他のアプリケーションで共通させるモデル(core/model.py)を以下のように定義する。
[app/model.py] from django.db import models class Organization(models.Model): organization_cd = models.CharField(max_length=5) name = models.CharField(max_length=20) def __unicode__(self): return self.name class Meta: ordering = ["organization_cd"] class User(models.Model): staff_cd = models.CharField(max_length=7) name = models.CharField(max_length=15) organization = models.ForeignKey(Organization)
[core/model.py] from django.db import models class User(models.Model): cd = models.CharField(max_length=7) name = models.CharField(max_length=15) def __str__(self): return "%s %s" % (self.cd, self.name)双方とも管理者画面からアクセスすると、2つのデータベースが作成されていることが確認できる。
0 件のコメント:
コメントを投稿