當一個項目當中有大量的數據的時候,你全部的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_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
在settings.py中指定DATABASE_ROUTERS性能
DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]
能夠指定多個數據庫路由,好比對於讀操做,Django將會循環全部路由中的db_for_read()
方法,直到其中一個有返回值,而後使用這個數據庫進行當前操做。code