django数据库分库

有些时候我们需要项目中的app访问不同的数据库,这时就要进行分库操作。

首先建立一个db_router.py,内容示例:

#coding=utf-8
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'xxxx',                      # Or path to database file if using sqlite3.
        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': '123456',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '3306',                      # Set to empty string for default. Not used with sqlite3.
        'OPTIONS': {  
                    'init_command': 'SET storage_engine=MyISAM',  
        },         
    },
    'analysis_db':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'analysis_qq',                      #分析相关的操作用这个库
        'HOST': '',
        'USER': 'root',
        'PASSWORD': '123456',
        'PORT':'3306',
        'OPTIONS':{
                    'init_command': 'SET storage_engine=MyISAM',
        },
    },
}
class MasterSlaveRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'analysisqq':
            return 'analysis_db'
        else:
            return 'default'
    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'analysisqq':
            return 'analysis_db'
        else:
            return 'default'
    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('default','analysis_db',)
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None
    def allow_syncdb(self, db, model):
        if db == 'analysis_db':
            print " in analysis db"
            return True
        elif db == 'default':
            return False
        else:
            return None
DATABASE_ROUTERS = ['db_router.MasterSlaveRouter']

然后在settings.py中删除和数据库相关的代码,添加from db_router import * ,这样之后指定的app就会使用特定的库了。

注意,这里分库是针对于读写操作,以及default已经存在后的syncdb,如果说你想执行syncdb同时就在不同数据库建表,这样操作是无效的。知道怎么做的请告知!