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的消息队列包SnakeMQ使用初探
Jun 29 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
python贪吃蛇游戏代码
Apr 18 Python
python从子线程中获得返回值的方法
Jan 30 Python
python如何保证输入键入数字的方法
Aug 23 Python
Python中求对数方法总结
Mar 10 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
python中round函数如何使用
Jun 19 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
Python基础之进程详解
May 21 Python
详解Python中下划线的5种含义
Jul 15 Python
python数字类型和占位符详情
Mar 13 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
php5 mysql分页实例代码
2008/04/10 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
jQuery代码优化之基本事件
2011/11/01 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
用Python编写简单的微博爬虫
2016/03/04 Python
Python引用模块和查找模块路径
2016/03/17 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
教导处工作制度
2014/01/18 职场文书
高中军训感言600字
2014/03/11 职场文书
工程售后服务方案
2014/06/08 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers