成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

django 多數據庫及分庫實現方式

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

定義及路由機制

定義

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

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數據庫呢,這就需要下面的路由。

路由注冊

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數據庫,否則就使用其他的;User2Router的邏輯類似。

如何注冊路由

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

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

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

路由機制

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

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

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

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

自動路由和手動路由

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

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

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

手動路由

查詢

使用using函數,參數就是要查詢的數據庫

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

保存或者更新

使用save的using參數,值就是要使用的數據庫

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

刪除

使用delete的using參數

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

分庫技術

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

垂直分庫

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

水平分庫

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

補充知識:Django實現數據庫讀寫分離、一主多從、分庫

讀寫分離

在工程中,通常需要實現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’: ’’, },}

接下來,需要創建數據庫的路由分發類。

可以在appname/utils下創建一個db_router.py文件,在文件中定義db_router類。類中實現讀庫寫庫的選擇。

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實現。

一主多從

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

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

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

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

分庫

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

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

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

標簽: Django
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
奇米精品一区二区三区四区| 亚洲美女免费在线| 国产精品日韩成人| 久久亚洲综合色| 捆绑变态av一区二区三区| 成人手机在线视频| 欧美日韩一区 二区 三区 久久精品| 中文字幕乱码一区二区免费| 成人久久视频在线观看| 欧美一区二区三区另类 | 欧美老年两性高潮| 91精品国产综合久久小美女| 国产精品久久毛片a| jlzzjlzz亚洲女人18| 日韩欧美一区二区三区在线| 久久99久久99小草精品免视看| 国产在线日韩| 717成人午夜免费福利电影| 亚洲天堂2016| 国产精品九九| 国产精品久久久久久久久搜平片| 九九在线精品视频| 久久久久免费| 亚洲成人高清在线| 久久大逼视频| 日本一区二区高清| 欧美福利在线| 中文字幕一区二区在线观看| 福利一区二区在线| 欧美一卡二卡在线观看| 国产真实乱偷精品视频免| 不卡的av中国片| 久久久精品天堂| 国产在线欧美日韩| 亚洲精品乱码久久久久久| 亚洲视频成人| 国产精品久久久久久久久免费樱桃 | 欧美肥妇free| 天堂在线一区二区| 色爱区综合激月婷婷| 蜜桃视频一区二区三区| 欧美亚洲禁片免费| 一区二区三区日韩欧美| 国产精品免费一区二区三区观看 | 久久精品中文| 洋洋av久久久久久久一区| 99一区二区| 天天影视网天天综合色在线播放 | 欧美日产在线观看| 狠狠色狠狠色综合系列| 欧美一区在线视频| 色综合婷婷久久| 国产精品天美传媒| 国产伦精品一区二区三区视频青涩 | 日韩美女视频19| 亚洲清纯自拍| 亚洲资源在线观看| 一本大道久久a久久综合婷婷| 中文字幕在线不卡国产视频| 成人黄色a**站在线观看| 欧美精品一区二| 亚洲特色特黄| 亚洲综合激情另类小说区| 久久婷婷丁香| 国产福利精品一区| 日本一区二区免费在线观看视频| 亚洲国产电影在线观看| 在线欧美视频| 日本欧美韩国一区三区| 欧美一区二区精美| 美女视频一区在线观看| 91.麻豆视频| 色综合久久中文综合久久牛| 日韩一卡二卡三卡四卡| 91猫先生在线| 亚洲国产日韩av| 91精品婷婷国产综合久久性色 | 老司机免费视频一区二区| 日韩欧美一卡二卡| 亚洲国产日本| 久久99精品久久久久久国产越南 | 国产精品入口66mio| 久久精品99国产国产精| 国产日产欧美精品一区二区三区| 91热门视频在线观看| ●精品国产综合乱码久久久久| 狠狠入ady亚洲精品| 婷婷综合另类小说色区| 色94色欧美sute亚洲线路二| 日本v片在线高清不卡在线观看| 91黄色激情网站| 99re8在线精品视频免费播放| 久久久久久久av麻豆果冻| 99在线精品视频在线观看| 亚洲日本护士毛茸茸| 99视频+国产日韩欧美| 一区二区三区四区精品在线视频| 91久久亚洲| 亚洲一区二区三区四区中文字幕| 色综合久久久久综合| 精品一区二区av| 国产婷婷色一区二区三区| 噜噜噜噜噜久久久久久91| 丁香桃色午夜亚洲一区二区三区| 2017欧美狠狠色| 亚洲精品护士| 懂色中文一区二区在线播放| 亚洲777理论| 精品国产91乱码一区二区三区 | 99精品免费视频| 国产美女娇喘av呻吟久久| 亚洲免费高清视频在线| 日韩一区二区电影| 久久夜色精品| 欧美久久综合| 国产一区视频导航| 伊人婷婷欧美激情| 精品久久人人做人人爰| 色哟哟亚洲精品| 国产精品扒开腿做爽爽爽软件| 亚洲免费色视频| 欧美福利视频一区| 日韩一级在线| 91女神在线视频| 国产综合色精品一区二区三区| 日韩欧美一区在线观看| 亚洲一区二区三区午夜| 欧美91福利在线观看| 日韩中文字幕av电影| 国产视频一区不卡| 欧美精品乱码久久久久久| 亚洲一区二区三区欧美 | 国产亚洲成aⅴ人片在线观看| 精品9999| 国产一区免费电影| 婷婷综合另类小说色区| 欧美美女bb生活片| 久久精品一二三区| 欧美精品一区二区视频| 丁香婷婷深情五月亚洲| 日韩福利视频导航| 精品粉嫩超白一线天av| 91久久精品一区二区三| 一区二区精品国产| 不卡的av网站| 亚洲精品久久久久久国产精华液| 色婷婷av一区二区三区之一色屋| 成人av在线影院| 亚洲图片欧美综合| 日韩美女精品在线| 久久综合九色综合久99| 怡红院精品视频在线观看极品| 日韩精品亚洲专区| 欧美少妇性性性| 亚洲欧美高清| 国产成人av电影在线| 日韩精品一级中文字幕精品视频免费观看| 日韩色视频在线观看| 久久综合九色99| 91在线观看下载| 精品一区二区免费在线观看| 男人的天堂久久精品| 久久久久99精品国产片| 中国成人在线视频| 国语对白精品一区二区| 成人午夜短视频| 国产精品自在在线| 日韩国产欧美三级| 中文一区二区在线观看| 日韩精品一区二区三区中文不卡| 国产欧美在线| 91美女片黄在线观看91美女| www.亚洲在线| 国产精品一线二线三线精华| 亚洲蜜臀av乱码久久精品| 久久久久久久综合| 2023国产精品视频| 日韩美女主播在线视频一区二区三区| 国产欧美日韩综合精品二区| 国产专区综合网| 日本aⅴ精品一区二区三区| 日韩精品色哟哟| 亚洲国产cao| 香蕉影视欧美成人| 欧美成人精品二区三区99精品| 国产视频一区三区| 亚洲精品字幕| 亚洲最黄网站| 在线成人h网| 精品成人一区| 欧美日韩福利| 伊伊综合在线| 亚洲经典在线看| 一区二区免费在线视频| 日韩一级欧洲| 国产精品视频久久一区| 国产精品久久一区二区三区| 老司机一区二区三区 | av电影天堂一区二区在线观看| 夜夜亚洲天天久久|