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中isalnum()方法的使用
May 18 Python
python 网络编程详解及简单实例
Apr 25 Python
Python多层装饰器用法实例分析
Feb 09 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
Python全栈之列表数据类型详解
Oct 01 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
python如何写出表白程序
Jun 01 Python
python如何查看安装了的模块
Jun 23 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python中lower函数实现方法及用法讲解
Dec 23 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.MVC的模板标签系统(一)
2006/09/05 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
jquery中动态效果小结
2010/12/16 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
python定时执行指定函数的方法
2015/05/27 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
python每天定时运行某程序代码
2019/08/16 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
python 负数取模运算实例
2020/06/03 Python
用python制作个音乐下载器
2021/01/30 Python
职业生涯规划怎么写
2013/12/29 职场文书
农村门前三包责任书
2014/07/25 职场文书
紧急迫降观后感
2015/06/15 职场文书
个人合作协议范本
2015/08/06 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
Python OpenCV 图像平移的实现示例
2021/06/04 Python