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工程中的冗余字符串
Jan 19 Python
python实现逆波兰计算表达式实例详解
May 06 Python
深入理解python多进程编程
Jun 12 Python
python实现批量修改文件名代码
Sep 10 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
pymysql模块使用简介与示例
Nov 17 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/04/09 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
Angular路由简单学习
2016/12/26 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
python重试装饰器示例
2014/02/11 Python
Python实现简单的代理服务器
2015/07/25 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
仓库保管员岗位职责
2013/12/20 职场文书
运动会广播稿150字
2014/02/19 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
明星邀请函
2015/02/02 职场文书
python实现简单的聊天小程序
2021/07/07 Python
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
Python实现制作销售数据可视化看板详解
2021/11/27 Python