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できないとか)ので気をつけた方が良い。

上に紹介した参考ページには色々コードが書いてあるので、参考になる。