django mysql 讀寫分離

來源:互聯網
上載者:User

標籤:django   讀寫分離   django mysql   django mysql 讀寫分離   

最近需要用到Django的MySQL讀寫分離技術,查了一些資料,把方法整理了下來。

在Django裡實現對MySQL的讀寫分離,實際上就是將不同的讀寫請求按一定的規則路由到不同的資料庫上(可以是不同類型的資料庫),我們需要做的就是,定義不同的資料庫,定義不同的路由規則。當然前提是你需要手動實現MySQL的主從同步..

首先定義我們的主從資料庫:

DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘ospf‘,        ‘USER‘: ‘root‘,        ‘PASSWORD‘: ‘hunantv‘,    },    ‘slave‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘ospf‘,        ‘USER‘: ‘ospf‘,        ‘PASSWORD‘: ‘hunantv‘,        ‘HOST‘: ‘192.168.8.52‘    }}

定義我們的路由規則,路由規則可以有好多個,每個規則是一個類。如下所示:  

import socketfrom django.conf import settingsdef test_connection_to_db(database_name):    try:        db_definition = getattr(settings, ‘DATABASES‘)[database_name]        s = socket.create_connection((db_definition[‘HOST‘], 3306), 2)        s.close()        return True    except (AttributeError, socket.timeout) as e:        return Falseclass FailoverRouter(object):    def db_for_read(self, model, **hints):        if model._meta.app_label == ‘ospf‘ and test_connection_to_db(‘slave‘):            return ‘slave‘        return ‘default‘    def db_for_write(self, model, **hints):        "Point all writes to the default db"        return ‘default‘    def allow_relation(self, obj1, obj2, **hints):        db_list = (‘default‘, ‘slave‘)        if obj1.state.db in db_list and obj2.state.db in db_list:            return True        return None    def allow_syncdb(self, db, model):        "Make sure only the default db allows syncdb"        return db == ‘default‘

db_for_read.有個read故名思議就是從哪裡讀. app_label是應用的名稱.. 

由於我希望使用者、許可權表還是從主要資料庫讀,,所以就加了這個限制.. test_connection_to_db 是判斷從資料庫是否異常,, 在異常的情況下會自動到 主要資料庫讀取.. 

最後在setting.py中加上這個路由規則:

DATABASE_ROUTERS = [‘lvs.models.FailoverRouter‘]

因為Django不負責主從資料庫之間的同步,所以如果在讀取完資料後馬上要對資料進行操作,可以顯式地使用主要資料庫來讀取並修改資料。

>>> Author.objects.using(‘default‘).all() 

>>> my_object.save(using=‘default‘)


本文出自 “webgame 自動化營運” 部落格,請務必保留此出處http://mstools.blog.51cto.com/1104047/1680195

django mysql 讀寫分離

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.