Django配置資料庫讀寫分離

2021-08-13 10:24:01 字數 2800 閱讀 6475

對**的資料庫作讀寫分離(read/write splitting)可以提高效能,在django中對此提供了支援,下面我們來簡單看一下。注意,還需要運維人員作資料庫的讀寫分離和資料同步。

我們知道在django專案的settings中,可以配置資料庫,除了預設的資料庫,我在下面又加了乙個db2。因為是演示,我這裡用的是預設的sqlite,如果希望用mysql,看這裡 。

databases = ,

'db2': ,

}

這裡我簡單建立一張產品表

from django.db import models

class

products

(models.model):

"""產品表"""

prod_name = models.charfield(max_length=30)

prod_price = models.decimalfield(max_digits=6, decimal_places=2)

建立完成後,執行資料庫遷移操作:

python manage.py makemigrations  # 在migrations資料夾下生成記錄,遷移前檢查

python manage.py migrate # 建立表

在migrations資料夾下生成記錄,並在遷移前檢查是否有問題,預設值檢查defualt資料庫,但是可以在後面的資料庫路由類(router)中通過allow_migrate()方法來指定是否檢查其它的資料庫。

其實第二步遷移預設有引數python manage.py migrate --database default,在預設資料庫上建立表。因此完成以上遷移後,執行python manage.py --database db2,再遷移一次,就可以在db2上建立相同的表。這樣在專案根目錄下,就有了兩個表結構一樣的資料庫,分別是db.sqlite3和db2.sqlite3。

手動讀寫分離

在使用資料庫時,通過.using(db_name)來手動指定要使用的資料庫

models.products.objects.using('default').create(prod_name='熊貓公仔', prod_price=12.99)

return httpresponse('寫入成功')

defread

(request):

obj = models.products.objects.filter(id=1).using('db2').first()

return httpresponse(obj.prod_name)自動讀寫分離

通過配置資料庫路由,來自動實現,這樣就不需要每次讀寫都手動指定資料庫了。資料庫路由中提供了四個方法。這裡這裡主要用其中的兩個:def db_for_read()決定讀操作的資料庫,def db_for_write()決定寫操作的資料庫。

定義router類

新建myrouter.py指令碼,定義router類:

class

router:

defdb_for_read

(self, model, **hints):

return

'db2'

defdb_for_write

(self, model, **hints):

return

'default'

配置router

settings.py中指定database_routers

database_routers = ['myrouter.router',]
可以指定多個資料庫路由,比如對於讀操作,django將會迴圈所有路由中的db_for_read()方法,直到其中乙個有返回值,然後使用這個資料庫進行當前操作。

一主多從方案

class

router:

defdb_for_read

(self, model, **hints):

""" 讀取時隨機選擇乙個資料庫

"""import random

return random.choice(['db2', 'db3', 'db4'])

defdb_for_write

(self, model, **hints):

""" 寫入時選擇主庫

"""return

'default'

class

router:

defdb_for_read

(self, model, **hints):

return

'db1'

return

'db2'

defdb_for_write

(self, model, **hints):

return

'db1'

return

'db2'

更多請參考官網

django資料庫讀寫分離

settings.py檔案中資料庫配置 用sqlite3 databases db2 用mysql databases db2 python manage.py makemigrations python manage.py migrate database db2 將default庫中的表結構同步...

資料庫讀寫分離

隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...

資料庫讀寫分離

隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...