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

相關文章
相關標籤/搜索