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)    收藏  举报

导航