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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
python实现的简单抽奖系统实例
May 22 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python实现多并发访问网站功能示例
Jun 19 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
python让列表倒序输出的实例
Jun 25 Python
python opencv实现运动检测
Jul 10 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
Python无头爬虫下载文件的实现
Apr 02 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
javascript求日期差的方法
2016/03/02 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&”)
2016/12/23 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
浅析Python中的多重继承
2015/04/28 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
Python3中详解fabfile的编写
2018/06/24 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
摄影专业毕业生求职信
2014/08/05 职场文书
满月酒邀请函
2015/01/30 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
电工实训心得体会
2016/01/14 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
React四级菜单的实现
2022/04/08 Javascript