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 相关文章推荐
Linux下使用python自动修改本机网关代码分享
May 21 Python
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
Python从零开始创建区块链
Mar 06 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
代码详解django中数据库设置
Jan 28 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
详解Python 函数参数的拆解
Sep 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
简单的PHP图片上传程序
2008/03/27 PHP
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
基于empty函数的判断详解
2013/06/17 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python对一个数向上取整的实例方法
2020/06/18 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
对学校的意见和建议
2015/06/04 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书