使用多數(shù)據(jù)庫最簡(jiǎn)單的方法是建立一個(gè)數(shù)據(jù)庫路由模式。默認(rèn)的路由模式確保對(duì)象’粘滯‘在它們?cè)嫉臄?shù)據(jù)庫上(例如,從foo 數(shù)據(jù)庫中獲取的對(duì)象將保存在同一個(gè)數(shù)據(jù)庫中)。默認(rèn)的路由模式還確保如果沒有指明數(shù)據(jù)庫,所有的查詢都回歸到default數(shù)據(jù)庫中。
你不需要做任何事情來激活默認(rèn)的路由模式 —— 它在每個(gè)Django項(xiàng)目上’直接‘提供。然而,如果你想實(shí)現(xiàn)更有趣的數(shù)據(jù)庫分配行為,你可以定義并安裝你自己的數(shù)據(jù)庫路由。
數(shù)據(jù)庫路由是一個(gè)類,它提供4個(gè)方法:
db_for_read(model, **hints)
建議model類型的對(duì)象的讀操作應(yīng)該使用的數(shù)據(jù)庫。
如果一個(gè)數(shù)據(jù)庫操作能夠提供其它額外的信息可以幫助選擇一個(gè)數(shù)據(jù)庫,它將在hints字典中提供。合法的hints 的詳細(xì)信息在下文給出。
如果沒有建議,則返回None。
db_for_write(model, **hints)
建議Model 類型的對(duì)象的寫操作應(yīng)該使用的數(shù)據(jù)庫。
如果一個(gè)數(shù)據(jù)庫操作能夠提供其它額外的信息可以幫助選擇一個(gè)數(shù)據(jù)庫,它將在hints字典中提供。 合法的hints 的詳細(xì)信息在下文給出。
如果沒有建議,則返回None。
allow_relation(obj1, obj2, **hints)
如果obj1 和obj2 之間應(yīng)該允許關(guān)聯(lián)則返回True,如果應(yīng)該防止關(guān)聯(lián)則返回False,如果路由無法判斷則返回None。這是純粹的驗(yàn)證操作,外鍵和多對(duì)多操作使用它來決定兩個(gè)對(duì)象之間是否應(yīng)該允許一個(gè)關(guān)聯(lián)。
allow_migrate(db, app_label, model_name=None, **hints)
定義遷移操作是否允許在別名為db的數(shù)據(jù)庫上運(yùn)行。如果操作應(yīng)該運(yùn)行則返回True ,如果不應(yīng)該運(yùn)行則返回False,如果路由無法判斷則返回None。
位置參數(shù)app_label 是正在遷移的應(yīng)用的標(biāo)簽。
大部分遷移操作設(shè)置model_name的值為正在遷移的模型的model._meta.model_name(模型的__name__ 的小寫)。對(duì)于RunPython和RunSQL 操作它的值為None,除非這兩個(gè)操作使用hint 提供它。
hints 用于某些操作來傳遞額外的信息給路由。
當(dāng)設(shè)置了model_name時(shí),hints 通常通過鍵'model'包含該模型的類。注意,它可能是一個(gè)歷史模型,因此不會(huì)有自定的屬性、方法或管理器。你應(yīng)該只依賴_meta。
這個(gè)方法還可以用來決定一個(gè)給定數(shù)據(jù)庫上某個(gè)模型的可用性。
注意,如果這個(gè)方法返回False,遷移將默默地不會(huì)在模型上做任何操作。這可能導(dǎo)致你應(yīng)用某些操作之后出現(xiàn)損壞的外鍵、表多余或者缺失。
Changed in Django 1.8:
allow_migrate的簽名與以前的版本相比發(fā)生了顯著更改。有關(guān)詳細(xì)信息,請(qǐng)參閱deprecation notes。
路由不必提供所有這些方法 —— 它可以省略一個(gè)或多個(gè)。如果某個(gè)方法缺失,在做相應(yīng)的檢查時(shí)Django 將忽略該路由。
例子:
DATABASES = { 'auth_db': { 'NAME': 'auth_db', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'swordfish', }, 'primary': { 'NAME': 'primary', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'spam', }, 'replica1': { 'NAME': 'replica1', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'eggs', }, 'replica2': { 'NAME': 'replica2', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'bacon', },}
現(xiàn)在我們將需要處理路由。首先,我們需要一個(gè)路由,它知道發(fā)送auth 應(yīng)用的查詢到auth_db:
class AuthRouter(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 'auth_db' 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 'auth_db' 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_migrate(self, db, app_label, model=None, **hints): """ Make sure the auth app only appears in the 'auth_db' database. """ if app_label == 'auth': return db == 'auth_db' return None
我們還需要一個(gè)路由,它發(fā)送所有其它應(yīng)用的查詢到primary/replica 配置,并隨機(jī)選擇一個(gè)replica 來讀?。?/p>
import randomclass PrimaryReplicaRouter(object): def db_for_read(self, model, **hints): """ Reads go to a randomly-chosen replica. """ return random.choice(['replica1', 'replica2']) def db_for_write(self, model, **hints): """ Writes always go to primary. """ return 'primary' def allow_relation(self, obj1, obj2, **hints): """ Relations between objects are allowed if both objects are in the primary/replica pool. """ db_list = ('primary', 'replica1', 'replica2') if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_migrate(self, db, app_label, model=None, **hints): """ All non-auth models end up in this pool. """ return True
最后,在設(shè)置文件中,我們添加如下內(nèi)容(替換path.to.為該路由定義所在的真正路徑):
DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
名稱欄目:django對(duì)多個(gè)數(shù)據(jù)庫支持-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://aaarwkj.com/article24/cdhdce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、App開發(fā)、外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站、品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容