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正则替换字符串函数re.sub用法示例
Jan 19 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
python 默认参数相关知识详解
Sep 18 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
pytorch模型存储的2种实现方法
Feb 14 Python
PyTorch安装与基本使用详解
Aug 31 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
详解用Python把PDF转为Word方法总结
Apr 27 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 身份验证方面的函数
2009/10/11 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python中使用中文的方法
2011/02/19 Python
Python 错误和异常小结
2013/10/09 Python
Python3基础之条件与循环控制实例解析
2014/08/13 Python
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
pycharm远程调试openstack代码
2017/11/21 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
师德标兵先进事迹材料
2014/12/19 职场文书
法院个人总结
2015/03/03 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android