Django 多数据库
目录
1. settings中添加数据库
2. settings中配置路由
3. 设置每个应用对应的数据库
4. 创建数据库路由规则
settings中添加数据库
在settings.py中配置DATABASES
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'chromevirt', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', "PORT": 3306, } 'test': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', "PORT": 3306, } }
settings中配置路由
在settings中配置DATABASE_ROUTERS
DATABASE_ROUTERS = ['your_project.database_router.DatabaseAppsRouter']
设置APP对应的数据库路由表
在settings.py中配置
DATABASE_APPS_MAPPING = { # 'app_name':'database_name', 'app01': 'default', 'test': 'test', }
创建数据库路由规则
在与settings.py同级路径下创建database_router.py
from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DatabaseAppsRouter(object): """ A router to control all database operations on models for different databases. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router will fallback to the `default` database. Settings example: DATABASE_APPS_MAPPING = {'app01': 'default', 'test': 'test'} """ def db_for_read(self, model, **hints): """"Point all read operations to the specific database.""" if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def db_for_write(self, model, **hints): """Point all write operations to the specific database.""" if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def allow_relation(self, obj1, obj2, **hints): """Allow any relation between apps that use the same database.""" db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label) db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label) if db_obj1 and db_obj2: if db_obj1 == db_obj2: return True else: return False return None def allow_syncdb(self, db, model): """Make sure that apps only appear in the related database.""" if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(model._meta.app_label) == db elif model._meta.app_label in DATABASE_MAPPING: return False return None def allow_migrate(self, db, app_label, model=None, **hints): """ Make sure the auth app only appears in the 'auth_db' database. """ if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(app_label) == db elif app_label in DATABASE_MAPPING: return False return None