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使用Flask框架获取当前查询参数的方法
Mar 21 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Django中使用celery完成异步任务的示例代码
Jan 23 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 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
PL-880隐藏功能
2021/03/01 无线电
由php if 想到的些问题
2008/03/22 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
PHP中比较时间大小实例
2014/08/21 PHP
php中执行系统命令的方法
2015/03/21 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
php和asp语法上的区别总结
2019/05/12 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
详解Python的循环结构知识点
2019/05/20 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Django如何使用redis作为缓存
2020/05/21 Python
python 写一个文件分发小程序
2020/12/05 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
购房协议书范本
2014/10/02 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
民事代理词范文
2015/05/25 职场文书
庆七一活动简报
2015/07/20 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers