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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人