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

  

posted @ 2022-01-14 17:09  zhuang6  阅读(27)  评论(0)    收藏  举报