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
"""确定user app 里面的数据之能迁移到user数据库里面"""
if app_label == 'app_name':
return True
return None
3 在setting中设置路由
DATABASE_ROUTERS = ['path.to.CustomterDatabaseRouter', 'path.to.MasterSlaveRouter']