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根据文件大小打log日志
Oct 09 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
python求最大连续子数组的和
Jul 07 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
pandas如何处理缺失值
Jul 31 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python数字类型math库原理解析
Mar 02 Python
Python callable内置函数原理解析
Mar 05 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP常用函数小技巧
2008/09/11 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
php 猴子摘桃的算法
2017/06/20 PHP
JS实现随机数生成算法示例代码
2013/08/08 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
秘书英文求职信范文
2014/01/31 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
建议书范文
2015/02/05 职场文书
母亲节感言
2015/08/03 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏