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删除特定文件的方法
Jul 30 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
python中关于for循环的碎碎念
Jun 30 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
Python 修改列表中的元素方法
Jun 26 Python
对python函数签名的方法详解
Jan 22 Python
python识别图像并提取文字的实现方法
Jun 28 Python
Python安装whl文件过程图解
Feb 18 Python
Python发送邮件实现基础解析
Aug 14 Python
Python进行区间取值案例讲解
Aug 02 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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 XML数据解析代码
2010/05/26 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
浅析php学习的路线图
2013/07/10 PHP
php实现分页工具类分享
2014/01/09 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
php经典趣味算法实例代码
2020/01/21 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
python实现五子棋游戏
2019/06/18 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
Python: glob匹配文件的操作
2020/12/11 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
应用心理学个人求职信范文
2013/12/11 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
javascript canvas实现雨滴效果
2021/06/09 Javascript