django多数据库
一 django多数据库
1) 数据库单实例---> 搭建MySQL主从(一主一从:读写分离)---> MySQL集群 ---> 分库分表
2) django中实现读写分离
3) 分表有两种:水平分表(按id范围分表),垂直分表(一对一的关系)
	MyCat:数据库中间件
    1--1000w在default的book表中
    1000w--2000w在db1的book表中
1 django中的配置
python manage.py makemigraions
python manage.py migrate app名称 - -databse = 配置文件数据名称的别名
# 手动操作:
    models.UserType.objects.using('db1').create(title='普通用户')
    result = models.UserType.objects.all().using('default')
# 自动操作:
    class Router1:
        def db_for_read(self, model, **hints):
            """
            Attempts to read auth models go to auth_db.
            """
            return 'db1'
        def db_for_write(self, model, **hints):
            """
            Attempts to write auth models go to auth_db.
            """
            return 'default'
    # 配置:
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            },
            'db1': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'),
            },
        }
        DATABASE_ROUTERS = ['db_router.Router1', ]
    # 使用:
        models.UserType.objects.create(title='VVIP')
        result = models.UserType.objects.all()
        print(result)
    # 补充:粒度更细
        class Router1:
            def db_for_read(self, model, **hints):
                """
                Attempts to read auth models go to auth_db.
                """
                if model._meta.model_name == 'usertype':
                    return 'db1'
                else:
                    return 'default'
            def db_for_write(self, model, **hints):
                """
                Attempts to write auth models go to auth_db.
                """
                return 'default'
2 问题
# 问题:
    app01中的表在default数据库创建
    app02中的表在db1数据库创建
    # 第一步:
    python manage.py makemigraions
    # 第二步:
    app01中的表在default数据库创建
    python manage.py migrate app01 --database = default
    # 第三步:
    app02中的表在db1数据库创建
    python manage.py migrate app02 --database = db1
    # 手动操作:
        m1.UserType.objects.using('default').create(title='VVIP')
        m2.Users.objects.using('db1').create(name='VVIP', email='xxx')
    # 自动操作:
        # 配置:
            class Router1:
                def db_for_read(self, model, **hints):
                    """
                    Attempts to read auth models go to auth_db.
                    """
                    if model._meta.app_label == 'app01':
                        return 'default'
                    else:
                        return 'db1'
                def db_for_write(self, model, **hints):
                    """
                    Attempts to write auth models go to auth_db.
                    """
                    if model._meta.app_label == 'app01':
                        return 'default'
                    else:
                        return 'db1'
            DATABASE_ROUTERS = ['db_router.Router1', ]
        # 使用:
            m1.UserType.objects.using('default').create(title='VVIP')
            m2.Users.objects.using('db1').create(name='VVIP', email='xxx')
3 其他:数据库迁移时进行约束
# 其他:
    # 数据库迁移时进行约束:
        class Router1:
            def allow_migrate(self, db, app_label, model_name=None, **hints):
                """
                All non-auth models end up in this pool.
                """
                if db == 'db1' and app_label == 'app02':
                    return True
                elif db == 'default' and app_label == 'app01':
                    return True
                else:
                    return False
    
            # 如果返回None,那么表示交给后续的router,如果后续没有router,则相当于返回True
    
            def db_for_read(self, model, **hints):
                """
                Attempts to read auth models go to auth_db.
                """
                if model._meta.app_label == 'app01':
                    return 'default'
                else:
                    return 'db1'
    
            def db_for_write(self, model, **hints):
                """
                Attempts to write auth models go to auth_db.
                """
                if model._meta.app_label == 'app01':
                    return 'default'
                else:
                    return 'db1'