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 将字符串转换成字典dict
Mar 24 Python
python数据结构之图的实现方法
Jul 08 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
Python反射用法实例简析
Dec 22 Python
python+opencv轮廓检测代码解析
Jan 05 Python
django中send_mail功能实现详解
Feb 06 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
详解python多线程之间的同步(一)
Apr 03 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 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
再说下636单管机
2021/03/02 无线电
微信公众平台天气预报功能开发
2014/07/06 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
竞争性谈判邀请书
2014/02/06 职场文书
高中课程设置方案
2014/05/28 职场文书
合作协议书格式
2014/08/19 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
见习期个人总结
2015/03/05 职场文书
暖春观后感
2015/06/08 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
Python中rapidjson参数校验实现
2021/07/25 Python
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers