django项目实现读写分离
1 搭建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