Djangoでは複数データベースを扱える。でも色々コーディングや設定が必要なのでメモしておく。参考:Multiple databases | Django documentation | Django。対応バージョンはDjango 1.7。使ったデータベースはPostgreSQL。
settings.py
settings.pyで複数データベースの接続設定をする
# settings.py
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
}
参考ページのをそのまま使った。さらに追加も出来る。
ここまでの設定でのマイグレーション
$ python manage.py migrate
だとdefault設定のデータベースへのマイグレーション、
$ python manage.py migrate --database=users
とするとusersで設定したデータベースへのマイグレーションとなる。 何も設定していないと、それぞれのデータベースに全アプリケーションの全てのモデルが反映される。
データベースに保存するアプリ、モデルを限定したい
ルーティング設定をする。
# settings.py
DATABASE_ROUTERS = ['myproject.routers.Router']
settings.pyはこんな感じ。んでmyprojectフォルダにrouters.pyを作成して例えばuserアプリのものだけusersデータベースを使うという設定の場合次のように書く
# routers.py
class Router(object):
def db_for_read(self, model, **hints):
#ここでランダムに選択すると、dbの負荷分散っぽいことが出来る
#例:return random.choice['default','users']
if model._meta.app_label == "user":
return "users"
return "default"
def db_for_write(self, model, **hints):
if model._meta.app_label == "user":
return "users"
return "default"
def allow_relation(self, obj1, obj2, **hints):
#Trueはリレーションを認める、Falseは認めない、Noneはこのコードでは関知しないという意味
return None
def allow_migrate(self, db, model):
#userアプリの場合はusers設定のデータベースへmigrate。
#他のアプリはusers以外のデータベースへmigrateする設定
if model._meta.app_label == "user"
return db == "users":
else:
return True
return False
routers.pyをちゃんと書かないと、色々不具合が出る(例:管理用のモデルがmigrateできないとか)ので気をつけた方が良い。
上に紹介した参考ページには色々コードが書いてあるので、参考になる。