django多数据库使用和设置

1 要使用多数据库必须在setting中种定义多个数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'HOST':'',
        'USER': '',
        'PASSWORD':'',
        'PORT':3306,

    },

'user':{

         'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'HOST':'',
        'USER': '',
        'PASSWORD':'',
        'PORT':3306,

},

'customer_master':{

 'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'HOST':'',
        'USER': '',
        'PASSWORD':'',
        'PORT':3306,

}

'customer_slave':{

 'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'HOST':'',
        'USER': '',
        'PASSWORD':'',
        'PORT':3306,

}

}

tip:django里面定义必须有default这个默认数据库,如果不想用可以直接创建一个空的数据库。

customer_master 和 customer_slave 是主从关系,主数据库用来写操作;从数据库用来读数据,可以有多个。

2使用数据库路由 定位到数据库

这么多个数据库,如何确定数据准确的写和读数据库呢?django中使用数据库路由

数据库路由的定义:

class CustomterDatabaseRouter(object):
    """关联到user数据库的路由"""
    def db_for_read(self,model,**hints):
        """读数据库的时候调用"""
        if model._meta.app_label == 'user':
            return 'user'
        return None
    
    def db_for_write(self,model,**hints):
        """写数据库时调用"""
        if model._meta.app_label == 'user':
            return 'user'
        return None
    
    def allow_relation(self,obj1,obj2,**hints):
        """允许user app 里面的model有关系"""
        if obj1._meta.app_label == 'user' or \
                        obj2._meta.app_label == 'user':
            return 'user'
        return None


    def allow_migrate(self,db,app_label,model=None,**hints):
        """确定user app 里面的数据之能迁移到user数据库里面"""
        if app_label == 'user':
            return db=='user'

        return None

tip:这四种方法你可以根据自己的业务需求自定义其中的一种或几种.

在定义一个处理读写分离的app的的路由。

class MasterSlaveRouter(object): 

"""关联到customer_master和 customer_slave数据库的路由 app_name: 读写分离的app的名"""

    def db_for_read(self,model,**hints):
        """读数据库的时候调用"""
        if model._meta.app_label == app_name:
            return 'customer_slave'
        return None
    
    def db_for_write(self,model,**hints):
        """写数据库时调用"""
        if model._meta.app_label == app_name:
            return 'customer_master'
        return None
    
    def allow_relation(self,obj1,obj2,**hints):
        """允许user app 里面的model有关系"""

        db_list = ['customer_master','customer_slave']
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self,db,app_label,model=None,**hints):
        """确定user app 里面的数据之能迁移到user数据库里面"""

        if app_label == 'app_name':
        return True
    return None

3 在setting中设置路由

DATABASE_ROUTERS = ['path.to.CustomterDatabaseRouter', 'path.to.MasterSlaveRouter']





    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值