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 @   不会钓鱼的猫  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示