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

