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爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
django项目搭建与Session使用详解
Oct 10 Python
Python 从相对路径下import的方法
Dec 04 Python
python实现狄克斯特拉算法
Jan 17 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
浅谈Python中的字符串
Jun 10 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
python pygame入门教程
Jun 01 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/08/21 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
pycharm修改file type方式
2019/11/19 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
python3 使用traceback定位异常实例
2020/03/09 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
创先争优承诺书范文
2014/03/31 职场文书
母校寄语大全
2014/04/10 职场文书
入股协议书范本
2014/04/14 职场文书
校园安全标语
2014/06/07 职场文书
手术室护士个人总结
2015/02/13 职场文书
任命通知范文
2015/04/21 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android