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读取Android permission文件
Nov 01 Python
Python时间戳与时间字符串互相转换实例代码
Nov 28 Python
Python下的Mysql模块MySQLdb安装详解
Apr 09 Python
Python实现的质因式分解算法示例
May 03 Python
对python字典过滤条件的实例详解
Jan 22 Python
了解不常见但是实用的Python技巧
May 23 Python
python实现BP神经网络回归预测模型
Aug 09 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
python能做哪些生活有趣的事情
Sep 09 Python
python编写实现抽奖器
Sep 10 Python
Python自动化xpath实现自动抢票抢货
Sep 19 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 启动报错如何解决
2014/01/17 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
Js+XML 操作
2006/09/20 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
详解javascript事件冒泡
2016/01/09 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
python概率计算器实例分析
2015/03/25 Python
详解Python中heapq模块的用法
2016/06/28 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
python Tkinter的图片刷新实例
2019/06/14 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
自学python用什么系统好
2020/06/23 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
静态变量和实例变量的区别
2015/07/07 面试题
白酒市场开发计划书
2014/01/09 职场文书
面试后的英文感谢信
2014/02/01 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
推荐信怎么写
2014/05/09 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
用Python实现屏幕截图详解
2022/01/22 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python
nginx 配置指令之location使用详解
2022/05/25 Servers