最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年04月01日 11:16:27   作者:G機器貓  
這篇文章主要介紹了django 多數(shù)據(jù)庫及分庫實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

定義及路由機制

定義

在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 None

class 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)方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python多線程和多進程關系詳解

    python多線程和多進程關系詳解

    在本篇文章里小編給大家整理的是一篇關于python多線程和多進程之間的聯(lián)系的基礎內容,有興趣的朋友們可以學習下。
    2020-12-12
  • Pandas中Series的屬性,方法,常用操作使用案例

    Pandas中Series的屬性,方法,常用操作使用案例

    這篇文章主要介紹了Pandas中Series的屬性,方法,常用操作使用案例,文章通過包的引入展開主題,需要的朋友可以參考一下
    2022-07-07
  • 關于Python錯誤重試方法總結

    關于Python錯誤重試方法總結

    在本篇文章里小編給網友們分享一篇關于關于Python錯誤重試方法總結內容,有需要的朋友們跟著學習參考下。
    2021-01-01
  • python中取整數(shù)的幾種方法

    python中取整數(shù)的幾種方法

    這篇文章主要給大家分享python中取整數(shù)的幾種方法技巧,文章將圍繞python取整數(shù)的詳細的相關資料展開內容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • 教你實現(xiàn)Ubuntu安裝Python

    教你實現(xiàn)Ubuntu安裝Python

    這篇文章主要為大家介紹了Ubuntu安裝Python的實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Flask搭建Web應用程序的方法示例

    Flask搭建Web應用程序的方法示例

    Flask是一個使用Python編寫的輕量級Web應用框架,本文我們將介紹一個使用Flask逐步搭建Web應用程序的簡單入門示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 使用python實現(xiàn)名片管理系統(tǒng)

    使用python實現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細介紹了使用python實現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • python3 實現(xiàn)的對象與json相互轉換操作示例

    python3 實現(xiàn)的對象與json相互轉換操作示例

    這篇文章主要介紹了python3 實現(xiàn)的對象與json相互轉換操作,結合實例形式分析了Python3使用json模塊針對json格式數(shù)據(jù)轉換操作的相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-08-08
  • Python之變量類型和if判斷方式

    Python之變量類型和if判斷方式

    這篇文章主要介紹了Python之變量類型和if判斷方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Series和DataFrame使用簡單入門

    Series和DataFrame使用簡單入門

    這篇文章主要介紹了Series和DataFrame使用簡單入門,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論

囊谦县| 旌德县| 安溪县| 阳春市| 禄丰县| 修文县| 崇左市| 老河口市| 和田市| 曲靖市| 白银市| 阿鲁科尔沁旗| 开阳县| 杭州市| 咸阳市| 溆浦县| 津南区| 长沙县| 大厂| 苗栗县| 孟津县| 台北市| 枣阳市| 神木县| 普定县| 旅游| 内黄县| 铜川市| 唐海县| 上饶县| 绥化市| 光山县| 沙雅县| 安平县| 剑河县| 奈曼旗| 重庆市| 沁水县| 遂昌县| 滨州市| 温宿县|