django项目实现读写分离

1 搭建MySQL主从

mysql主从搭建

 

2 在settings中配置

settings.py

DATABASES = {
    # 主库
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '100.0.0.200',
        'PORT': 33307,
    },
    # 从库
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '100.0.0.200',
        'PORT': 33306,
    },
}

 

3 手动指定读写分离

views.py

# 在读写操作前,使用using,指定库
from django.shortcuts import render, HttpResponse
from app01 import models

def index(request):
    # 指定向default库(主库)写入,不指定默认写入default
    models.Book.objects.using('default').create(name='西游记',price=33)
    # 指定去db1库(从库)读
    res = models.Book.objects.using('db1').all().first()
    print(res.name)
    return HttpResponse('ok')

 

4 自动读写分离

新建一个py文件,如db_router.py

# 定义一个类,写入一下两个方法

class Router:
    def db_for_read(self, model, **hints):   # 去db1库读
        return 'db1'
    
    def db_for_write(self, model, **hints):  # 去default库写
        return 'default'

settings.py

# 注册
# from db_router import Router

DATABASE_ROUTERS = ['db_router.Router',]

配置好后,写操作自动写入default库,读操作自动去db1库读取,不需要使用using,跟正常的ORM代码一样

 

5 更细粒度的读写分离

如果做了数据库分库分表,需要确定哪些表去哪些库里读,如db_router.py

class Router1:
    def db_for_read(self, model, **hints):
        if model._meta.model_name == 'book':  # model是传过来的表模型,如果是book表,去db1库读数据,其他表去default库读数据
            return 'db1'
        else:
            return 'default'

    def db_for_write(self, model, **hints):
        return 'default'

 

6 补充

在数据库迁移时,可以指定把哪个app的表结构迁移到哪个库

# 不加app名称,表示记录全部app的数据结构迁移
python manage.py makemigrations app名称 

# 指定连接哪库,settings中配置了多个库,如果建立了主从,默认连接default(数据迁移到主库,从库自然也就有了)
python manage.py migrate app名称 --database=settings中数据库名称的别名
python manage.py migrate app01 --database=default

 

posted @ 2022-11-04 11:42  不会钓鱼的猫  阅读(36)  评论(0编辑  收藏  举报