您好,登錄后才能下訂單哦!
這篇文章主要介紹了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()方法,直到其中一個有返回值,然后使用這個數據庫進行當前操作。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。