Django--操作mysql实现读写分离

django操作mysql读写分离

# 0 mysql主从搭建好了

# 1 在setting中配置
DATABASES = {
    # 主库      
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '101.133.225.166',
        'PORT': 33307,
    },
    # 从库
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '101.133.225.166',
        'PORT': 33306,
    },
}

# 注:orm的读写 默认就是default库,故:一般主库 别名就叫 default

    
# 2 orm 创建表模型 并迁移
  # 在数据库迁移时,可以指定把哪个app的表结构迁移到哪个库 (settings中数据库的别名)
  python manage.py migrate app01 --database=default  # 不写 默认为 default


# 3 orm 操作表数据  指定使用哪个库进行操作
### 3.1 手动指定
    # 向主库写     不跟using参数  默认为default库
    res=models.Book.objects.using('default').create(name='金1梅',price=33.4)
    
    # 去从库查
    res=models.Book.objects.using('db1').all().first()
    # print(res.name)
    
    
### 3.2 自动指定  写router和配置setting 
    # 1. db_router.py中  写一个Router1类
      class Router1:
          def db_for_read(self, model, **hints):
              return 'db1'
          def db_for_write(self, model, **hints):
              return 'default'
    
    # 2.在setting中注册 DATABASE_ROUTERS
	DATABASE_ROUTERS = ['db_router.Router1',]
      
    # 注:自动指定后,以后只要是写操作就会用default,只要是读操作就会用db1


# 4 更细粒度  Router类的方法  可以指定到某个表   通常是分库分表后 使用
class Router1:
    def db_for_read(self, model, **hints):
        if model._meta.model_name == 'book':
            return 'db1'
        else:
            return 'default'

    def db_for_write(self, model, **hints):
        return 'default'
posted @ 2022-09-22 15:39  Edmond辉仔  阅读(75)  评论(0编辑  收藏  举报