日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式

瀏覽:36日期:2024-10-13 15:50:27

定義及路由機(jī)制

定義

在settings里面的DATABASES是一個字典,用于定義需要的數(shù)據(jù)庫,如下,一共定義了兩個數(shù)據(jù)庫。

DATABASES = { ’default’: { ’NAME’: ’app_data’, ’ENGINE’: ’django.db.backends.postgresql_psycopg2’, ’USER’: ’postgres_user’, ’PASSWORD’: ’s3krit’ }, ’user1’: { ’NAME’: ’user1_data’, ’ENGINE’: ’django.db.backends.mysql’, ’USER’: ’mysql_user’, ’PASSWORD’: ’priv4te’ } ’user2’: { ’NAME’: ’user2_data’, ’ENGINE’: ’django.db.backends.mysql’, ’USER’: ’mysql_user’, ’PASSWORD’: ’priv4te’ }}

那么什么時候調(diào)用default什么時候調(diào)用users數(shù)據(jù)庫呢,這就需要下面的路由。

路由注冊

class User1Router(object): ''' A router to control all database operations on models in the auth application. ''' def db_for_read(self, model, **hints): ''' Attempts to read auth models go to auth_db. ''' if model._meta.app_label == ’auth’: return ’user1’ return None def db_for_write(self, model, **hints): ''' Attempts to write auth models go to auth_db. ''' if model._meta.app_label == ’auth’: return ’user1’ return None def allow_relation(self, obj1, obj2, **hints): ''' Allow relations if a model in the auth app is involved. ''' if obj1._meta.app_label == ’auth’ or obj2._meta.app_label == ’auth’: return True return None def allow_syncdb(self, db, model): ''' Make sure the auth app only appears in the ’auth_db’ database. ''' if db == ’auth_db’: return model._meta.app_label == ’auth’ elif model._meta.app_label == ’user1’: return False return Noneclass User2Router(object): ''' A router to control all database operations on models in the auth application. ''' def db_for_read(self, model, **hints): ''' Attempts to read auth models go to auth_db. ''' if model._meta.app_label == ’auth2’: return ’user2’ return None def db_for_write(self, model, **hints): ''' Attempts to write auth models go to auth_db. ''' if model._meta.app_label == ’auth2’: return ’user2’ return None def allow_relation(self, obj1, obj2, **hints): ''' Allow relations if a model in the auth app is involved. ''' if obj1._meta.app_label == ’auth’ or obj2._meta.app_label == ’auth’: return True return None def allow_syncdb(self, db, model): ''' Make sure the auth app only appears in the ’auth_db’ database. ''' if db == ’auth_db’: return model._meta.app_label == ’auth2’ elif model._meta.app_label == ’user2’: return False return None

User1Router的路由邏輯是,如果model所屬的app是auth的話,就使用user1數(shù)據(jù)庫,否則就使用其他的;User2Router的邏輯類似。

如何注冊路由

光定義路由程序無法調(diào)用到,還需要注冊到django中,在settings中定義

DATABASE_ROUTERS = [’path.to.User1Router’ , ’path.to.User2Router’]

path.to:是User1Router的完整python包路徑,所以,User1Router不一定要在settings中實(shí)現(xiàn),可以在任何地方。

路由機(jī)制

那么django是如何選擇其中一個路由的呢?

1. django按照注冊的順序輪詢DATABASE_ROUTERS,所以首先驗(yàn)證User1Router是否返回了非空字符串,如果是,則使用User1Router;如果不是則接著驗(yàn)證后面的Router;

2. 同樣驗(yàn)證User2Router,如果User2Router返回了非空字符串,則使用User2Router;如果不是則使用default數(shù)據(jù)庫;

3. 所以可以看出,路由注冊的順序是會影響最后的結(jié)果的,注冊在前面的路由會優(yōu)先被使用;

自動路由和手動路由

上面定義的Router是自動路由,意思是django會自動輪詢所注冊的路由器,某個model會保存在哪個數(shù)據(jù)庫,是django通過注冊的Router自動獲得的,在編碼中你不需要指定;

手動路由,則是你可以在編碼中指定某個model要保存到哪個數(shù)據(jù)庫。

而且手動路由也有性能方面的優(yōu)點(diǎn),如果定義了很多個數(shù)據(jù)庫,每次保存或者讀取model都要把輪詢一遍路由列表,顯然效率有些低,如果程序邏輯清楚的知道當(dāng)前的代碼應(yīng)該連接哪個數(shù)據(jù)庫,顯示指定的方式顯然效率更高。

手動路由

查詢

使用using函數(shù),參數(shù)就是要查詢的數(shù)據(jù)庫

User.objects.using(’user1’).all()

保存或者更新

使用save的using參數(shù),值就是要使用的數(shù)據(jù)庫

>>> my_object.save(using=’user1’)

刪除

使用delete的using參數(shù)

>>> user_obj.delete(using=’user1’)

分庫技術(shù)

下面緊緊介紹分庫的思路。

垂直分庫

即一個app對應(yīng)一個數(shù)據(jù)庫,上面自動路由的例子就是一個垂直分庫的例子,auth1使用user1數(shù)據(jù)庫,auth2使用user2數(shù)據(jù)庫。當(dāng)然也可以使用手動路由。

水平分庫

水平分庫建議使用手動路由,因?yàn)槊總€model的分庫機(jī)制可能都不一樣,自動路由實(shí)現(xiàn)起來有些麻煩會造成性能不高,而手動路由,每個model根據(jù)自己的規(guī)則來獲得不同的數(shù)據(jù)庫。

補(bǔ)充知識:Django實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離、一主多從、分庫

讀寫分離

在工程中,通常需要實(shí)現(xiàn)mysql讀寫分離。在Django中需要支持讀寫分離的話,只需要很簡單的幾步就可以了。

首先,配置讀庫和寫庫。

在django項(xiàng)目的settings.py中,配置讀庫和寫庫。

DATABASES = { ’default’: { ’ENGINE’: ’django.db.backends.mysql’, ’NAME’: ’WIPS’, ’USER’: ’mysql’, ’PASSWORD’: ’360tianxun#^)Sec’, ’HOST’: ’’, ’PORT’: ’’, }, ’slave’: { ’ENGINE’: ’django.db.backends.mysql’, ’NAME’: ’TEST’, ’USER’: ’mysql’, ’PASSWORD’: ’360tianxun#^)Sec’, ’HOST’: ’’, ’PORT’: ’’, },}

接下來,需要創(chuàng)建數(shù)據(jù)庫的路由分發(fā)類。

可以在appname/utils下創(chuàng)建一個db_router.py文件,在文件中定義db_router類。類中實(shí)現(xiàn)讀庫寫庫的選擇。

class DBRouter(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 = [’appname.utils.db_router.DBRouter’ ]

重新啟動Django就完成了。

這里需要注意的是,Django只完成了讀寫分離,但mysql主庫、從庫的同步操作并不歸django負(fù)責(zé),依然需要mysql實(shí)現(xiàn)。

一主多從

一主多從的方案在實(shí)際應(yīng)用中是更常見的配置。在上面配置的基礎(chǔ)上,只需要修改幾個地方,就可以實(shí)現(xiàn)一主多從了。

首先,修改settings.py,增加全部從庫的設(shè)置。

其次,修改db_router類中db_for_read(),下面是隨機(jī)選取讀庫的例子。也可以根據(jù)實(shí)際的需要,選取不同的調(diào)度算法。

class DBRouter(object): def db_for_read(self, model, **hints): import random return random.choice([’slave’, ’slave2’, ’slave3’])

分庫

當(dāng)需要不同的app使用不同的庫時,可以利用model中的app_label來實(shí)現(xiàn)db的路由。

class DBRouter(object): def db_for_read(self, model, **hints): if model._meta.app_label == ’app01’: import random return random.choice([’app01_slave1’, ’app01_slave2’, ’app01_slave3’]) if model._meta.app_label == ’app02’: return 'app02_slave'

按照上面的操作就很容易實(shí)現(xiàn)mysql的讀寫分離、一主多從和分庫了。但這個方法只建議用在小項(xiàng)目上。

以上這篇django 多數(shù)據(jù)庫及分庫實(shí)現(xiàn)方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品888| 欧美精品国产一区| 免费在线观看一区二区三区| 国产亚洲高清一区| 日韩中文字幕亚洲一区二区va在线| 天堂久久av| 欧美国产91| 蜜桃成人精品| 国产精品自拍区| 亚洲三级在线| 亚洲综合精品| 国产精品97| 91精品国产自产在线观看永久∴| 国产精品扒开腿做爽爽爽软件| 蜜桃免费网站一区二区三区| 婷婷亚洲五月色综合| 成人一二三区| 欧美aa在线视频| 中文字幕日韩高清在线| 91精品一区二区三区综合在线爱| 伊人久久亚洲| 美女精品一区| 国产亚洲高清视频| 午夜在线观看免费一区| 91精品推荐| 影视先锋久久| 激情欧美国产欧美| 性欧美69xoxoxoxo| 香蕉国产精品| 首页欧美精品中文字幕| 欧美aⅴ一区二区三区视频| 国产精品嫩草影院在线看| 日韩一区精品视频| 中文字幕日韩欧美精品高清在线| 亚洲一区二区小说| 在线观看亚洲精品福利片| 日韩专区在线视频| 欧美在线黄色| 精品国产99| 亚洲va中文在线播放免费| 亚洲国产专区校园欧美| 婷婷综合社区| 日韩精品一级| 免费一级欧美片在线观看网站 | 亚洲深深色噜噜狠狠爱网站| 怡红院精品视频在线观看极品| 模特精品在线| 91免费精品国偷自产在线在线| 久久wwww| 狠狠爱www人成狠狠爱综合网| 丝袜美腿亚洲一区| 欧美自拍一区| 香蕉成人av| 亚洲免费一区三区| 国产videos久久| 伊人成人网在线看| 国产日韩欧美一区二区三区在线观看| 精品久久久网| 国产精品视频一区二区三区四蜜臂 | 在线亚洲一区| 精品亚洲二区| 免费久久精品视频| 欧美丰满日韩| 亚洲最新av| 成人片免费看| 色在线中文字幕| 成人自拍av| 视频一区二区国产| 国产精品自拍区| 久久夜色精品| 精品成人免费一区二区在线播放| 日本成人一区二区| 欧美在线观看视频一区| 久久久久久亚洲精品美女| 视频一区在线播放| 日韩国产一区二区| 久久亚洲资源中文字| 亚洲精选久久| 国产精品91一区二区三区| 国产一区2区| 日韩激情一区二区| 欧美综合另类| 精精国产xxxx视频在线播放| 欧美日本不卡高清| 日韩精品欧美精品| 综合国产视频| 蜜桃久久久久久| 丝袜诱惑制服诱惑色一区在线观看| 激情视频网站在线播放色| 麻豆精品少妇| 国产精品亚洲欧美日韩一区在线| 亚洲人妖在线| 日本一区二区三区中文字幕| 免播放器亚洲一区| 视频一区二区中文字幕| 午夜av一区| 欧美成人国产| 黄色亚洲免费| 国产精品婷婷| 中文字幕一区日韩精品| 中文字幕亚洲精品乱码| 亚洲欧美日本国产| 国产精品一区亚洲| 久久免费视频66| 日韩不卡在线| 日韩午夜av| 日韩毛片一区| 免费在线成人| 亚洲精品.com| 欧美一区=区| 天堂久久av| 国产精品巨作av| 亚洲a在线视频| 另类av一区二区| 欧美天堂一区| 人人香蕉久久| 视频精品一区二区| 国产精品一区二区三区www| 国产一区日韩| 欧美日韩一二三四| 午夜日韩影院| 91综合网人人| 日韩精品一级二级 | 国产精品xxxav免费视频| 麻豆国产在线| 久久亚洲不卡| 毛片不卡一区二区| 欧美91视频| 免费日韩成人| 免费观看在线色综合| 精品精品国产三级a∨在线| 亚洲国产成人精品女人| 国产剧情在线观看一区| 在线 亚洲欧美在线综合一区| 国产精品mm| 免费美女久久99| 色老板在线视频一区二区| 石原莉奈在线亚洲三区| 亚洲国产欧美日本视频| 日韩av午夜在线观看| 久久伦理在线| 精品国产网站| 欧美一区精品| 欧美专区18| 免费视频国产一区| 极品av在线| 久久一区视频| 国产欧美二区| 亚洲精品亚洲人成在线观看| 999久久久国产精品| 久久97视频| 国产日韩三级| 午夜在线视频观看日韩17c| 日本国产精品| av高清不卡| 黑森林国产精品av| 精品在线网站观看| 美女av一区| 麻豆91小视频| 国产精品一区二区美女视频免费看 | 色一区二区三区| 国产精品流白浆在线观看| 清纯唯美亚洲综合一区| 亚洲丝袜美腿一区| 在线视频亚洲欧美中文| 亚洲一区免费| 日韩在线一区二区| 亚洲欧美成人综合| 蜜臀久久久久久久| 日本一区福利在线| 欧美天堂在线| 精品日本视频| 成人片免费看| 欧美亚洲国产激情| 在线亚洲观看| 日韩二区三区在线观看| 亚洲精品极品| 国产高清亚洲| 国产一区二区精品久| 欧洲av一区二区| 亚洲欧美视频| 国产欧美久久一区二区三区| 精品国产a一区二区三区v免费| 日韩一区三区| 99久久激情| 日本成人在线视频网站| 亚洲v在线看| 97精品97| 日韩专区精品| 1000部精品久久久久久久久| 日韩精品麻豆| 另类专区亚洲| 国产理论在线| 蜜桃视频在线网站| 日本久久成人网| 亚洲先锋成人| 国产精品人人爽人人做我的可爱 | 91成人小视频| 免费日韩成人| 日本免费久久|