对网站的数据库作读写分离(Read/Write Splitting)可以提高性能,在Django中对此提供了支持,下面我们来简单看一下。注意,还需要运维人员作数据库的读写分离和数据同步。

配置数据库

我们知道在Django项目的settings中,可以配置数据库,除了默认的数据库,我在下面又加了一个db2。因为是演示,我这里用的是默认的SQLite,如果希望用MySQL,看这里 。

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'),},
}

创建models并执行数据库迁移

这里我简单创建一张产品表

from django.db import modelsclass Products(models.Model):"""产品表"""prod_name = models.CharField(max_length=30)prod_price = models.DecimalField(max_digits=6, decimal_places=2)

创建完成后,执行数据库迁移操作:

python manage.py makemigrations  # 在migrations文件夹下生成记录,迁移前检查
python manage.py migrate  # 创建表

在migrations文件夹下生成记录,并在迁移前检查是否有问题,默认值检查defualt数据库,但是可以在后面的数据库路由类(Router)中通过allow_migrate()方法来指定是否检查其它的数据库。

其实第二步迁移默认有参数python manage.py migrate --database default ,在默认数据库上创建表。因此完成以上迁移后,执行python manage.py --database db2,再迁移一次,就可以在db2上创建相同的表。这样在项目根目录下,就有了两个表结构一样的数据库,分别是db.sqlite3和db2.sqlite3。

读写分离

手动读写分离

在使用数据库时,通过.using(db_name)来手动指定要使用的数据库

from django.shortcuts import HttpResponse
from . import modelsdef write(request):models.Products.objects.using('default').create(prod_name='熊猫公仔', prod_price=12.99)return HttpResponse('写入成功')def read(request):obj = models.Products.objects.filter(id=1).using('db2').first()return HttpResponse(obj.prod_name)

自动读写分离

通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()决定读操作的数据库,def db_for_write()决定写操作的数据库。

定义Router类

新建myrouter.py脚本,定义Router类:

class Router:def db_for_read(self, model, **hints):return 'db2'def db_for_write(self, model, **hints):return 'default'
配置Router

settings.py中指定DATABASE_ROUTERS

DATABASE_ROUTERS = ['myrouter.Router',]  

可以指定多个数据库路由,比如对于读操作,Django将会循环所有路由中的db_for_read()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。

一主多从方案

网站的读的性能通常更重要,因此,可以多配置几个数据库,并在读取时,随机选取,比如:

class Router:def db_for_read(self, model, **hints):"""读取时随机选择一个数据库"""import randomreturn random.choice(['db2', 'db3', 'db4'])def db_for_write(self, model, **hints):"""写入时选择主库"""return 'default'

分库分表

在大型web项目中,常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,比如app01走数据库db1,app02走数据库

class Router:def db_for_read(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'def db_for_write(self, model, **hints):if model._meta.app_label == 'app01':return 'db1'if model._meta.app_label == 'app02':return 'db2'

更多请参考官网

Django配置数据库读写分离相关推荐

  1. mysql读写分离java配置方法_springboot配置数据库读写分离

    为什么要做数据库读写分离 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用 ...

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

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

  3. 使用阿里云的负载均衡服务器配置流程和配置数据库读写分离配置(全)

    一.创建用于添加到负载均衡服务器中的ecs实例(假定已有一台运行中的服务器) 1.选择用于添加到负载均衡中的ecs服务器,创建一个镜像 2.创建ecs服务器(根据负载需要几台就创建几台),选择自定义镜 ...

  4. 018:Django商城部署和数据库读写分离

    本章知识点 1.Centos下python3环境的部署 2.Python uwsgi 3.Python uwsgi+nginx部署 4.mysql主从备份介绍 5.Linux下的mysql安装 6.基 ...

  5. 连接pgsql_Laravel 数据库连接配置和读写分离

    今天开始讲如何在 Laravel 中操作数据库,Laravel 为我们提供了多种工具实现对数据库的增删改查,在我们使用 Laravel 提供的这些数据库工具之前,首先要连接到数据库. 数据库的连接配置 ...

  6. Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

    作者 | Pythonicc 责编 | 王晓曼 出品 | CSDN博客 简介 1.什么是数据库读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELET ...

  7. ceph集群和数据库到底是储存数据_Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

    作者 | Pythonicc责编 | 王晓曼出品 | CSDN博客简介1.什么是数据库读写分离读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从 ...

  8. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

    java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...

  9. ef mysql 读写分离_EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一...

    /// ///SQL命令拦截器///主要实现EF的读写分离/// public classCommandInterceptor : DbCommandInterceptor {staticComman ...

最新文章

  1. linux挂载其他硬盘
  2. silverlight学习布局之:布局stackpanel
  3. 步步高java短信恢复_步步高智能手机自带的程序不见了怎么找回
  4. 几种适合开发用的在线编辑器-推荐及下载
  5. 【树链剖分】春季大扫除(P6805)
  6. MongoDB在Linux下常用优化设置
  7. C#中IEnumerable.OfType()方法的简单使用
  8. [原创]个人工具 - 对APK极限压缩并对齐的工具(58.ReExtremeZipAndAlignAPK)
  9. 通过讲课来建立自己的知识系统
  10. leetcode笔记:Majority Element
  11. (字符串)ZigZag Conversion
  12. 通信原理ami码c语言实现,通信原理AMI码型变换实验
  13. 大数据平台之数据存储
  14. 华为手机左侧快捷方式_让华为手机使用更轻松,这些快捷键与手势该知道!
  15. 浅谈显著性检测!真的很浅
  16. 全民小视频逆势崛起:短视频的“小趋势”与“信用飞轮”
  17. Python开发qq批量登陆
  18. [MCSM] Slice Sampler
  19. 做人要厚道,不要太冲
  20. 再接再厉mms 资源 转

热门文章

  1. (王道408考研操作系统)第四章文件管理-第一节9:文件系统的层次结构
  2. 单值二叉树:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。
  3. Thrift 编译链接的时候出问题
  4. pcap_open 和 pcap_open_live
  5. windows route netstat arp命令
  6. The repository does not have a Release
  7. socket epoll网络编程实例
  8. Python 查看pip安装的包的位置(查看pip安装包的路径)
  9. oracle中的日期查询在mybatis中写法
  10. 【洛谷1341】无序字母对(欧拉回路)