一、在配置文件中增加slave数据库的配置
DATABASES ={'default': {'ENGINE': 'django.db.backends.mysql','HOST': '127.0.0.1','PORT': 3306, # 主'USER': 'root', # 主数据库用户名'PASSWORD': 'password', # 主数据库密码'NAME': 'database_name'# 主数据库名字
},'slave': {'ENGINE': 'django.db.backends.mysql','HOST': '127.0.0.1','PORT': 8306, #从'USER': 'root', # 从数据库用户名'PASSWORD': 'password', # 从数据库密码'NAME': 'database_name'# 从数据库名字
}}
migrate --database slave 将主数据库中的数据表迁移到从数据库
mysql的读写分离在django框架中有两种方式设置:自动方式和手动方式
二、django中mysql读写分离的自动方式
通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。
这里主要用其中的两个:
def db_for_read()决定读操作的数据库
def db_for_write()决定写操作的数据库
1、创建数据库操作的路由分发类
在项目封装功能的utils文件夹中创建db_router.py
class MasterSlaveDBRouter(object):"""数据库主从读写分离路由"""def db_for_read(self, model,**hints):"""读数据库"""return"slave" # 返回dj中配置中的数据库名称def db_for_write(self, model,**hints):"""写数据库"""return"default"def allow_relation(self, obj1, obj2,**hints):"""是否运行关联操作"""return True
如果有多个从库,则
def db_for_read(self, model, **hints):
# 读取时随机选择一个数据库
import random
return random.choice(["slave1", "slave2"])
在大型web项目中,常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,比如app01走数据库db1,app02走数据库db2,则:
class MasterSlaveDBRouter:
def db_for_read(self, model,**hints):if model._meta.app_label == 'goods':
return'default'
if model._meta.app_label == 'trade':
return'default'def db_for_write(self, model,**hints):if model._meta.app_label == 'app01':
return'salve01'
if model._meta.app_label == 'app02':
return'slave02'
2、项目setting配置文件中配置读写分离路由
# 配置读写分离
DATABASE_ROUTERS= ['your app name.utils.db_router.MasterSlaveDBRouter'] # 指定你的路由分发类
三、手动方式
在使用数据库时,通过.using(db_name)来手动指定要使用的数据库
例如:
GoodInfo.object.using(‘default’).all() 说明default这个设置下的数据库是用来专门读取数据的
Usermessage.object.using(‘slave’).create() 说明slave这个设置下的数据库是专门来写入数据的
其它,自动方式,也可以手动指定要使用的数据库:
保存或者删除也可以指定数据库
对象名.save(using=’default’) 或者.using(‘default’).update()
对象名.delete(using=’slave’)
参考:https://blog.csdn.net/weixin_43229759/article/details/86552476