Django的数据库读写分离

1、首先是配置数据库

在settings.py文件中增加多个数据库的配置:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db2': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'), # 指定数据库名
}
}

使用mysql的配置:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'user',
'PASSWORD': 'pd',
'NAME': 'db_read'
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 8306,
'USER': 'root',
'PASSWORD': 'pd',
'NAME': 'db_write'
}
}

2、执行数据库迁移

python manage.py migrate   -- database db2  # 将default库中的表结构同步到db2

执行完上面的指令之后,你就会发现,db2这个库里面就有了我们的表

3、看看读写分离的情况下,django怎么玩

  • 手动读写分离

在视图函数中,通过objects.using("库名") 指定使用哪个库

from django.shortcuts import HttpResponse
from . import models def write(request):
models.Products.objects.using('default').create(name='大猿', age=12)
return HttpResponse('写入成功') def read(request):
obj = models.Products.objects.using('db2').filter(id=1).first()
return HttpResponse(obj.name)
  • 自动读写分离

重写创建一个py文件,这里我们创建一个router.py文件

class Router:
# 读操作用default库,就return这个库名字符串
def db_for_read(self,model,**kwargs): # db_for_read固定写法,读操作自动匹配 # db_for_write固定写法,写操作自动匹配
return 'default' # 读操作用db2库,就return这个库名字符串
def db_for_write(self,model,**kwargs): # db_for_write固定写法,写操作自动匹配
return 'db2'

还需要在settings.py文件中进行配置:

DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了

设置自动之后就不需要在视图的逻辑函数中操作库时使用using

def dbtest(request):
data = []
# 向db2数据库中写入数据
models.Class.objects.create(name='大猿',age=18) # 从db1中读取数据
data = models.Class.objects.all() return render(request,'dbtest.html',{'data':data})

4、一主多从方案

一主多从的时候,也就是从多个数据库中读取的时候,我们可以这样操作:还是创建一个文件写入下边的函数

import random

class Router:
def db_for_read(self, model, **kwargs):
return random.choices(['db1', 'db2', 'db3'])
#多个库读的时候,可以简单的写个随机选择 def db_for_write(self, model, **kwargs):
return 'db'

在settings.py文件的配置和上边的一样:

DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了

5、分库分表

当我们需要让不同的app操作不同的数据库时,比如app01操作数据库db1,app02操作数据库db2,我们应该如何去做,还是创建单独的文件,写法如下:

class Router:
def db_for_read(self, model, **kwargs):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2' def db_for_write(self, model, **kwargs):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2' # model._meta.app_label 获取当前函数所在app的app名称 # 如果是类,需要将类名加上
# model.UserInfo._meta.app_label 获取该类所在app的app名称

在settings.py文件的配置:

DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了

Django的数据库读写分离的更多相关文章

  1. (转)Django配置数据库读写分离

    转:https://blog.csdn.net/Ayhan_huang/article/details/78784486 转:http://www.cnblogs.com/dreamer-fish/p ...

  2. 配置Django中数据库读写分离

    django在进行数据库操作的时候,读取数据与写数据(曾.删.改)可以分别从不同的数据库进行操作 修改配置文件: DATABASES = { 'default': { 'ENGINE': 'djang ...

  3. Django----配置数据库读写分离

    Django配置数据库读写分离 https://blog.csdn.net/Ayhan_huang/article/details/78784486 https://blog.csdn.net/ayh ...

  4. django数据库读写分离

    django数据库读写分离 1. 配置数据库 settings.py文件中 用SQLite: DATABASES = { 'default': { 'ENGINE': 'django.db.backe ...

  5. Django中MySQL读写分离技术

    最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...

  6. linux中MySQL主从配置(Django实现主从读写分离)

    一 linux中MySQL主从配置原理(主从分离,主从同步) mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志里面: 2)master有一个I/O线程将二进制日志发送到sl ...

  7. Spring aop应用之实现数据库读写分离

    Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...

  8. CYQ.Data V5 数据库读写分离功能介绍

    前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...

  9. ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction

    如题:ThinkPHP v3.2.3 数据库读写分离,开启事务时报错: ERR: There is no active transaction 刚开始以为是数据表引擎不对造成的,因为 有几张表的引擎是 ...

随机推荐

  1. 【java学习笔记2】访问控制修饰符 public、protected、默认、private

    先写了一个User()类: package chapter01; public class User { // 私有的 private int id; // 受保护的 protected int ag ...

  2. draggable()拖拽时限制移动区域

    jQuery-UI为我们提供了一个非常便捷的拖拽方法:draggable(),在使用此方法时,我们可能会希望控件只在某一区域中移动,不能被拖出边界,这样的话我们可以使用下面的方法: 调用draggab ...

  3. HTC Vive使用WebVR的方法以及启用后头显无画面的解决方法

    1.下载支持WebVR的浏览器. 笔者使用的是HTC Vive,故下载了Firefox的Nightly版本[下载地址]. 2.Nightly 开启WebVR的步骤[引用自Mozilla VR] 1.从 ...

  4. RPC 核心,万变不离其宗

    微信搜 「yes的练级攻略」干货满满,不然来掐我,回复[123]一份20W字的算法刷题笔记等你来领. 个人文章汇总:https://github.com/yessimida/yes 欢迎 star ! ...

  5. flowable 实现多实例-会签-动态配置人员 参考demo

    会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...

  6. 手摸手带你用Hexo撸博客(一)

    原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...

  7. SLA

    服务级别协议[编辑] 维基百科,自由的百科全书     跳到导航跳到搜索 本条目可参照外语维基百科相应条目来扩充. 若您熟悉来源语言和主题,请协助参考外语维基扩充条目.请勿直接提交机械翻译,也不要翻译 ...

  8. 一次mongo查询不存在字段引发的事故

    话说今天的一个小小的查询失误给了我比较深刻的教训,也让我对mongo有了更深刻的理解,下面我们来说说这个事情的原委: 我们经常使用阿里云子账号在DMS上查询线上数据库数据,今天也是平常的一次操作 集合 ...

  9. 在vscode中配置sass savepath

    1.先在VSCode上面安装插件:Live Sass Compiler 2.创建好scss文件夹文件和css文件夹 3.然后在VSCode的控制台上打开Live sass watching模式(控制台 ...

  10. Docker部署&MySQL部署

    Docker部署 本文采用的是阿里云的centos7 # 更新yum yum update # 安装docker yum install docker # 启动docker systemctl sta ...