Django连接数据库并实现读写分离过程解析


Posted in Python onNovember 13, 2019

这篇文章主要介绍了Django连接数据库并实现读写分离过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

当一个项目当中有大量的数据的时候,你所有的IO操作都在一个数据库中操作,会造成项目的性能的降低。如果你能对项目中的数据进行读写分离的话,那么将大大提高你项目的性能。而Django自带的机制也对此提供了支持。我们可以简单的操作一下。(当然数据的同步还是需要运维同志的协助)

修改配置文件

Django默认的是default,我们按照它的格式直接添加一个新的配置:

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

当然,如果你不想使用默认的sqlite3,想使用mysql还需要自己进行一下配置

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': '127.0.0.1', # 主服务器的运行ip
    'PORT': 3306,  # 主服务器的运行port
    'USER': 'django', # 主服务器的用户名
    'PASSWORD': 'django', # 主服务器的密码
    'NAME': 'djangobase'  # 数据表名
  },
  'slave': {
    'ENGINE': 'django.db.backends.mysql', 
    'HOST': '127.0.0.1',
    'PORT': 8306,
    'USER': 'django_slave',
    'PASSWORD': 'django_slave',
    'NAME': 'djangobase_slave'
  }
}

在项目目录下的__init__文件中添加以下代码,将数据连接方式改为pymysql

import pymysql
pymysql.install_as_MySQLdb()

将数据配置修改完之后就可以在models.py文件当中创建表,接下里就可以进行数据库迁移了

python manage.py makemigrations # 在migrations文件夹下生成记录
python manage.py migrate --database default # 默认可以不写参数
python manage.py migrate --database db2 # 在从库再迁移一次,就可以在上面建立相同的表

手动读写分离

在遇到数据库相关操作的话,需要手动指定要使用的相应数据库,不需要进行多余的配置,但是,当你数据的读写操作过于频繁的时候,这个方法就会略显繁琐。

from django.shortcuts import render, HttpResponse
from app001 import models
# Create your views here.
def write(request):
  models.User.objects.using('default').create(name='张三', pwd='123', phone=1234)
  return HttpResponse('写成功')
def read(request):
  obj = models.User.objects.filter(id=1).using('db2').first()
  return HttpResponse('读成功')

自动读写分离

通过配置数据库路由,来自动实现读写分离,这样就不需要每次读写都手动指定数据库。

在项目的app中创建db_router.py文件,并在该文件中定义一个数据库路由类,用来进行读写分离,这个类最多提供四个方法,分别是:db_for_read、db_for_write、allow_relation、allow_migrate,以下只写了三个。

定义数据库路由类

class MasterSlaveDBRouter(object):
  """数据库主从读写分离路由"""
 
  def db_for_read(self, model, **hints):
    """读数据库"""
    return "slave"
 
  def db_for_write(self, model, **hints):
    """写数据库"""
    return "default"
 
  def allow_relation(self, obj1, obj2, **hints):
    """是否运行关联操作"""
    return True

配置Router

在settings.py中指定DATABASE_ROUTERS

DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中Random和Math模块学习笔记
May 18 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
python 实现倒排索引的方法
Dec 25 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
对Django 转发和重定向的实例详解
Aug 06 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
用Python绘制漫步图实例讲解
Feb 26 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
Python离线安装各种库及pip的方法
Nov 28 Python
Python 键盘事件详解
Nov 11 Python
Pandas操作CSV文件的读写实现方法
Nov 13 #Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 #Python
Series和DataFrame使用简单入门
Nov 13 #Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 #Python
Python坐标线性插值应用实现
Nov 13 #Python
python如果快速判断数字奇数偶数
Nov 13 #Python
Python 异步协程函数原理及实例详解
Nov 13 #Python
You might like
高亮度显示php源代码
2006/10/09 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python的迭代器与生成器实例详解
2014/07/16 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
如何基于Python实现数字类型转换
2020/02/07 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
买房委托公证书
2014/04/08 职场文书
个人主要事迹材料
2014/08/26 职场文书
党校毕业心得体会
2014/09/13 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
小学教代会开幕词
2016/03/04 职场文书
python实现批量移动文件
2021/04/05 Python
linux下安装redis图文详细步骤
2021/12/04 Redis
工厂无线对讲系统解决方案
2022/02/18 无线电
MySQL Server 层四个日志
2022/03/31 MySQL