Django链接多个数据库并实现读写分离

当一个项目当中有大量的数据的时候,你全部的IO操做都在一个数据库中操做,会形成项目的性能的下降。若是你能对项目中的数据进行读写分离的话,那么将大大提升你项目的性能。而Django自带的机制也对此提供了支持。咱们能够简单的操做一下。(固然数据的同步仍是须要运维同志的协助)python

修改配置文件

Django默认的是default,咱们按照它的格式直接添加一个新的配置:mysql

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还须要本身进行一下配置sql

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文件当中建立表,接下里就能够进行数据库迁移了django

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

在项目的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()方法,直到其中一个有返回值,而后使用这个数据库进行当前操做。code

相关文章
相关标签/搜索