django中的mysql主从读写分离:二、django配置mysql主从分离
一、在配置文件中增加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
posted on 2019-10-27 16:07 myworldworld 阅读(425) 评论(0) 收藏 举报