Django連接數(shù)據(jù)庫并實(shí)現(xiàn)讀寫分離過程解析
這篇文章主要介紹了Django連接數(shù)據(jù)庫并實(shí)現(xiàn)讀寫分離過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
前言
當(dāng)一個(gè)項(xiàng)目當(dāng)中有大量的數(shù)據(jù)的時(shí)候,你所有的IO操作都在一個(gè)數(shù)據(jù)庫中操作,會造成項(xiàng)目的性能的降低。如果你能對項(xiàng)目中的數(shù)據(jù)進(jìn)行讀寫分離的話,那么將大大提高你項(xiàng)目的性能。而Django自帶的機(jī)制也對此提供了支持。我們可以簡單的操作一下。(當(dāng)然數(shù)據(jù)的同步還是需要運(yùn)維同志的協(xié)助)
修改配置文件
Django默認(rèn)的是default,我們按照它的格式直接添加一個(gè)新的配置:
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'), } }
當(dāng)然,如果你不想使用默認(rèn)的sqlite3,想使用mysql還需要自己進(jìn)行一下配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 主服務(wù)器的運(yùn)行ip 'PORT': 3306, # 主服務(wù)器的運(yùn)行port 'USER': 'django', # 主服務(wù)器的用戶名 'PASSWORD': 'django', # 主服務(wù)器的密碼 'NAME': 'djangobase' # 數(shù)據(jù)表名 }, 'slave': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'PORT': 8306, 'USER': 'django_slave', 'PASSWORD': 'django_slave', 'NAME': 'djangobase_slave' } }
在項(xiàng)目目錄下的__init__文件中添加以下代碼,將數(shù)據(jù)連接方式改為pymysql
import pymysql pymysql.install_as_MySQLdb()
將數(shù)據(jù)配置修改完之后就可以在models.py文件當(dāng)中創(chuàng)建表,接下里就可以進(jìn)行數(shù)據(jù)庫遷移了
python manage.py makemigrations # 在migrations文件夾下生成記錄 python manage.py migrate --database default # 默認(rèn)可以不寫參數(shù) python manage.py migrate --database db2 # 在從庫再遷移一次,就可以在上面建立相同的表
手動(dòng)讀寫分離
在遇到數(shù)據(jù)庫相關(guān)操作的話,需要手動(dòng)指定要使用的相應(yīng)數(shù)據(jù)庫,不需要進(jìn)行多余的配置,但是,當(dāng)你數(shù)據(jù)的讀寫操作過于頻繁的時(shí)候,這個(gè)方法就會略顯繁瑣。
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('讀成功')
自動(dòng)讀寫分離
通過配置數(shù)據(jù)庫路由,來自動(dòng)實(shí)現(xiàn)讀寫分離,這樣就不需要每次讀寫都手動(dòng)指定數(shù)據(jù)庫。
在項(xiàng)目的app中創(chuàng)建db_router.py文件,并在該文件中定義一個(gè)數(shù)據(jù)庫路由類,用來進(jìn)行讀寫分離,這個(gè)類最多提供四個(gè)方法,分別是:db_for_read、db_for_write、allow_relation、allow_migrate,以下只寫了三個(gè)。
定義數(shù)據(jù)庫路由類
class MasterSlaveDBRouter(object): """數(shù)據(jù)庫主從讀寫分離路由""" def db_for_read(self, model, **hints): """讀數(shù)據(jù)庫""" return "slave" def db_for_write(self, model, **hints): """寫數(shù)據(jù)庫""" return "default" def allow_relation(self, obj1, obj2, **hints): """是否運(yùn)行關(guān)聯(lián)操作""" return True
配置Router
在settings.py中指定DATABASE_ROUTERS
DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]
可以指定多個(gè)數(shù)據(jù)庫路由,比如對于讀操作,Django將會循環(huán)所有路由中的db_for_read()方法,直到其中一個(gè)有返回值,然后使用這個(gè)數(shù)據(jù)庫進(jìn)行當(dāng)前操作。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解讀Tensorflow2.0訓(xùn)練損失值降低,但測試正確率基本不變的情況
這篇文章主要介紹了Tensorflow2.0訓(xùn)練損失值降低,但測試正確率基本不變的情況,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06用Python實(shí)現(xiàn)一個(gè)簡單的用戶系統(tǒng)
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)一個(gè)簡單的用戶系統(tǒng),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01Python?sklearn庫三種常用編碼格式實(shí)例
這篇文章主要為大家介紹了Python?sklearn庫三種常用編碼格式實(shí)例展示,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09在OpenCV里使用Camshift算法的實(shí)現(xiàn)
這篇文章主要介紹了在OpenCV里使用Camshift算法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11