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

您的位置:首頁技術文章
文章詳情頁

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

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

定義及路由機制

定義

在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’ }}

那么什么時候調用default什么時候調用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的邏輯類似。

如何注冊路由

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

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

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

路由機制

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

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

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

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

自動路由和手動路由

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

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

而且手動路由也有性能方面的優(yōu)點,如果定義了很多個數(shù)據(jù)庫,每次保存或者讀取model都要把輪詢一遍路由列表,顯然效率有些低,如果程序邏輯清楚的知道當前的代碼應該連接哪個數(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’)

分庫技術

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

垂直分庫

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

水平分庫

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

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

讀寫分離

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

首先,配置讀庫和寫庫。

在django項目的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類。類中實現(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負責,依然需要mysql實現(xiàn)。

一主多從

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

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

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

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

分庫

當需要不同的app使用不同的庫時,可以利用model中的app_label來實現(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'

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

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

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩第一| 亚洲香蕉视频| 国产精品日本| 欧美精品一卡| 鲁大师成人一区二区三区| 99在线观看免费视频精品观看| 三上悠亚国产精品一区二区三区| 日本精品不卡| 国精品一区二区| 精品国产中文字幕第一页| 久久xxx视频| 国产高清精品二区| 激情综合五月| 红杏一区二区三区| 国产在线不卡一区二区三区| 黄色在线观看www| 开心激情综合| 91亚洲国产成人久久精品| 激情综合激情| 国产精品一区二区中文字幕| 欧美在线看片| 国产精品自拍区| 国产精一区二区| 亚洲另类av| 视频一区日韩| 99精品网站| 久久国产婷婷国产香蕉| 日韩电影免费网址| 日本大胆欧美人术艺术动态| 国产精品永久| 久久激情婷婷| 精品一区视频| 欧美中文字幕一区二区| 日本va欧美va精品发布| 日韩在线网址| 国产精品久久乐| 欧美一区二区三区免费看| 国产一区二区三区日韩精品| 丰满少妇一区| 久久久夜夜夜| 日本大胆欧美人术艺术动态| 日韩不卡在线观看日韩不卡视频| 国产精品久av福利在线观看| 国产精品乱战久久久| 成人在线视频区| 亚洲国产专区校园欧美| 久久九九国产| 国产精品一区免费在线| 日韩精品视频中文字幕| 老牛影视一区二区三区| 亚洲天堂久久| 国产精品调教视频| 亚洲一区二区三区四区电影| 国产激情欧美| 777久久精品| 国产日韩在线观看视频| 亚洲女同中文字幕| 视频二区不卡| 日韩欧美不卡| 成人在线免费观看91| 日韩av一区二| 91麻豆精品激情在线观看最新| 国产亚洲亚洲| 蜜臀久久久久久久| 一二三区精品| 久久av免费| 三级欧美韩日大片在线看| 久久av电影| 国产精品调教视频| 国产精品亲子伦av一区二区三区 | 好吊一区二区三区| 国产精品黄网站| 欧洲一级精品| 少妇精品久久久一区二区| 国产成人精品亚洲日本在线观看| 婷婷久久免费视频| 黄色国产精品| 亚洲中字黄色| 亚洲精品美女91| 日韩不卡在线观看日韩不卡视频| 日本h片久久| 日韩国产91| 日韩av中文字幕一区二区三区| 日欧美一区二区| 国产极品久久久久久久久波多结野 | 久久在线视频免费观看| 国产91久久精品一区二区| 久色成人在线| 欧洲精品一区二区三区| 免费日本视频一区| 91一区二区三区四区| 欧美日韩国产在线一区| 日韩激情一区二区| 欧美日韩视频| 国产高潮在线| 久久97久久97精品免视看秋霞| 日韩激情精品| 蘑菇福利视频一区播放| 国产一区二区久久久久| 天堂久久av| 欧美日韩国产免费观看视频| 精品欧美日韩精品| 日本成人精品| 快she精品国产999| 欧美一区二区性| 亚洲高清二区| 97久久亚洲| 模特精品在线| 亚洲免费网址| а√天堂8资源在线| 亚洲精品免费观看| 国产超碰精品| 久久久久国产精品一区二区| 蜜臀久久99精品久久久画质超高清 | 欧美日韩99| 亚洲国产一区二区在线观看| 国产高潮在线| 久久免费福利| 91精品国产自产观看在线| 亚洲永久精品唐人导航网址| 国产午夜精品一区二区三区欧美 | 国产精久久一区二区| 久久精品国产久精国产爱| 欧美 日韩 国产精品免费观看| 天堂资源在线亚洲| 日韩一区精品| 日韩一区二区三免费高清在线观看 | 91p九色成人| 亚洲精品美女| 偷拍精品精品一区二区三区| 国产成人精品亚洲线观看| 国产精品麻豆成人av电影艾秋| 亚洲精品一二三**| 丝袜亚洲另类欧美| 日韩精品一区二区三区中文 | 日韩精品国产欧美| 国产精品一区三区在线观看| 国产亚洲字幕| 麻豆久久一区| 九九99久久精品在免费线bt| 精品国产美女a久久9999| 高清一区二区三区av| 国产精品中文字幕亚洲欧美 | 99香蕉国产精品偷在线观看 | 日韩av在线播放网址| 国产精久久一区二区| 日韩国产在线观看| 麻豆精品av| 麻豆精品久久久| 国产一区二区三区黄网站| 中文视频一区| 悠悠资源网久久精品| 蜜臀久久99精品久久久久宅男| 色婷婷成人网| 日韩一区二区三区高清在线观看| 国产精品久久久久毛片大屁完整版| 久久字幕精品一区| 久久精品国产99久久| 亚洲天堂日韩在线| 久久精品成人| 综合亚洲视频| 久久国产成人午夜av影院宅| 亚洲香蕉久久| 久久99高清| 亚洲精品欧美| 精品午夜久久| 亚洲免费成人av在线| 樱桃视频成人在线观看| 99日韩精品| 国产精东传媒成人av电影| 丝袜美腿亚洲一区| 国产suv精品一区二区四区视频 | 欧美日韩1区| 99久久夜色精品国产亚洲1000部| 色狠狠一区二区三区| 国产精品试看| 日韩大片免费观看| 国产精品久久国产愉拍| 天堂精品久久久久| 亚洲最大av| 精品理论电影在线| 国产精品久久久久9999高清| 在线亚洲成人| 亚洲综合在线电影| 亚洲精品进入| 蜜臀av性久久久久蜜臀aⅴ流畅| 九九99久久精品在免费线bt| 久久国产亚洲| 日本天堂一区| 四虎4545www国产精品| 天堂精品久久久久| 色婷婷精品视频| 国产日韩欧美中文在线| 国产综合视频| 日韩中文一区二区| 在线观看免费一区二区| 久久天堂成人| 日韩精品一级中文字幕精品视频免费观看 | 日韩精彩视频在线观看| 午夜在线精品|