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_readdb_for_writeallow_relationallow_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()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。

原文地址:https://www.cnblogs.com/Yang-Sen/p/11387432.html

时间: 2024-09-29 14:22:09

Django连接多个数据库并实现读写分离的相关文章

Django——连接sql server数据库

Django——连接sql server数据库 *在此注明,本人使用的是python3.5和Django2.0.4 sql server是微软出的一款闭源的可运行于windows和linux平台上的关系型数据库.由于其闭源的特性,所以较少有公司使用,但是比较神奇的是,我所在的公司和我几个朋友所在的公司业务都是以爬虫为主,都是以sql server作为主要的数据库在使用. 一.打包 如果你是使用Django的老手应该知道Django默认不支持sql server:如果你刚开始接触Django,那么

net Core 使用MyCat分布式数据库,实现读写分离

net Core 使用MyCat分布式数据库,实现读写分离 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我们今天主要介绍一下,在我们的Asp.net Core中如何使用Mycat,这源于一个大神(Amamiya Yuuko)的分享,但是,这中间还是有少许的 坑 : 首先,因为大神是比较忙的,而且主要分享关键技术,所以有些地方很简略,而往往这些简

浅谈高性能数据库集群——读写分离

本文主要介绍高性能数据库集群读写分离相关理论,基本架构,涉及的复杂度问题以及常见解决方案. 1 读写分离概述 基本架构图: 2 适用场景 读写分离不是银弹,并不是一有性能问题就上读写分离,而是应该先优化,例如优化慢查询,调整不合理的业务逻辑,引入缓存查询等只有确定系统没有优化空间后才考虑读写分离集群 3 引入的系统复杂度问题 问题一 主从复制延迟 问题二 分配机制 如何将读写操作区分开来,然后访问不同的数据库服务器? 解决方案1 客户端程序代码封装实现 基本架构图 业界开源实现 Sharding

Django ORM 数据库设置和读写分离

一.Django的数据库配置 (一)修改settings.py文件关于数据库的配置: Django默认使用sqlite: # Django默认的数据库库,SQLit配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # sqlite引擎 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 再添加一个数据库:仿照"default"的格式直接添加: DAT

数据库主从复制与读写分离(了解)

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的.无论是在安全性.高可用性还是高并发等各个方面都是完全不能满足实际需求的.因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力.有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据.语句做备份. 如图所示: 一. 案例前置知识点 1. mysq支持的复制类型 1) 基于语句的复制.在服务器上执行sql语句,在从服务器上执行同样

数据库主从复制和读写分离

参考文档: http://www.cnblogs.com/crazylqy/p/5542558.html http://www.cnblogs.com/gl-developer/p/6170423.html https://mp.weixin.qq.com/s?__biz=MzAxMTEyOTQ5OQ==&mid=400643724&idx=1&sn=82e5b5ec9e0567abea4cc1d960265d9e#rd https://www.jianshu.com/p/89ad

微服务化的数据库设计与读写分离

数据库永远是应用最关键的一环,同时越到高并发阶段,数据库往往成为瓶颈,如果数据库表和索引不在一开始就进行良好的设计,则后期数据库横向扩展,分库分表都会遇到困难. 对于互联网公司来讲,一般都会使用Mysql数据库. 一.数据库的总体架构 我们首先来看Mysql数据的总体架构如下: 这是一张非常经典的Mysql的系统架构图,通过这个图可以看出Mysql各个部分的功能. 当客户端连接数据库的时候,首先面对的是连接池,用于管理用户的连接,并会做一定的认证和鉴权. 连接了数据库之后,客户端会发送SQL语句

数据库---mysql主从复制读写分离

http://m.open-open.com/m/lib/view/1413274853450.html 原理及架构分析 部署前准备 下载好源码包存放位置要与脚本中对应 mysql-5.5.22.tar.gz,cmake-2.8.6.tar.gz,amoeba-mysql-binary-2.2.0.tar.gz,jdk-6u14-linux-x64.bin selinux和iptables不做设置,关闭 系统光盘镜像为本地yum源,配置好yum文件 环境介绍: 主服务器(master):192.

MyCat实现数据库与数据库之间的读写分离

一.Mycat的安装准备: 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 3.Mycat: Mycat的官方网站: http://www.mycat.org.cn/ 下载地址: https://github.com/MyCATApache/Mycat-download Mycat的安装 Mycat有windows.linux多种版本.本教程为linux安装步骤,windows基本相同. 第一步:下载Mycat-server-xxxx-linux.t