【Django】Django使用多数据库

暂未找到一个app应用多个数据库的方法,可使用app与数据库映射的方式去做

  • settings.py文件配置数据库
    DATABASES = {
        # 默认数据库配置
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'database_name', # 自定义数据库名称
            'USER': 'db_username',
            'PASSWORD': 'db_user_password',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 30,
            'OPTION': {
                'init_command': 'SET default_storage_engine=INNODB'
            }
        },
        'business': { #secondDb代表第二个数据库的配置#该名称可自定义
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'second_db_name',
            'USER': 'db_username ',
            'PASSWORD': 'db_user_password',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 30,
            'OPTION': {
                'init_command': 'SET default_storage_engine=INNODB'
            },
        },
    #...略
    }
    ....
    # 数据库路由指向
    DATABASE_ROUTERS = ['config.database_router.DatabaseRouter']
    # 数据库与app映射
    DATABASE_APPS_MAPPING = {
        # example:
        # 'app_name':'database_name',
        'business': 'business',
    }
    # 配置不允许迁移的app下的model
    APPS_NOT_ALLOW_MIGRATE = ['business'] 
    
  • settings.py所在目录新建文件database_router.py
    from django.conf import settings
    
    DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
    
    
    class DatabaseRouter(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 = {'app1': 'db1', 'app2': 'db2'}
        """
        using = "django4"
    
        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
    
  • 在相应的models.py表中指定app_label
    class Business(models.Model):
        # 地址
        id = UUIDField(primary_key=True, verbose_name='id')
        type = CharField(default='d2d', max_length=200, verbose_name='类型')
        ....
        class Meta:
            # 指定绑定的app
            app_label = 'business'
            db_table = 'vll'
            verbose_name = '业务'
            verbose_name_plural = '业务'
    
上一篇:centos7.9 yum 卸载docker 报database is locked 与


下一篇:mysql创建数据库