Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離的示例
讀寫(xiě)分離,顧名思義,我們可以把讀和寫(xiě)兩個(gè)操作分開(kāi),減輕數(shù)據(jù)的訪問(wèn)壓力,解決高并發(fā)的問(wèn)題。
那么我們今天就Python兩大框架來(lái)做這個(gè)讀寫(xiě)分離的操作。
1.Django框架實(shí)現(xiàn)讀寫(xiě)分離
Django做讀寫(xiě)分離非常的簡(jiǎn)單,直接在settings.py中把從機(jī)加入到數(shù)據(jù)庫(kù)的配置文件中就可以了。
DATABASES = {’default’: {’ENGINE’: ’django.db.backends.mysql’,’HOST’: ’127.0.0.1’, # 主服務(wù)器的運(yùn)行ip’PORT’: 3306, # 主服務(wù)器的運(yùn)行port’USER’: ’django_master’, # 主服務(wù)器的用戶(hù)名’PASSWORD’: ’django_master’, # 主服務(wù)器的密碼’NAME’: ’djangobase_master’ # 數(shù)據(jù)表名},’slave’: {’ENGINE’: ’django.db.backends.mysql’,’HOST’: ’127.0.0.1’,’PORT’: 3307,’USER’: ’django_slave’,’PASSWORD’: ’django_slave’,’NAME’: ’djangobase_slave’}}
在項(xiàng)目的app文件中創(chuàng)建db_route.py文件,直接在文件里定義一個(gè)數(shù)據(jù)庫(kù)路由類(lèi),用以區(qū)分讀寫(xiě)操作。
'''數(shù)據(jù)庫(kù)讀寫(xiě)路由''' def db_for_read(self, model, **hints):'''讀'''return 'slave' def db_for_write(self, model, **hints):'''寫(xiě)'''return 'default' def allow_relation(self, obj1, obj2, **hints):'''是否運(yùn)行關(guān)聯(lián)操作'''return True
最后我們?cè)趕ettings.py中寫(xiě)個(gè)路由配置就可以了。
DATABASE_ROUTERS = ['app001.db_router.MasterSlaveDBRouter']
Flask框架實(shí)現(xiàn)讀寫(xiě)分離
首先自定義Session類(lèi),重寫(xiě)get_bind方法,根據(jù)self.flushing判斷讀寫(xiě)操作,選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù)。
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy, SignallingSession, get_statefrom sqlalchemy import orm class RoutingSession(SignallingSession): def get_bind(self, mapper=None, clause=None): state = get_state(self.app) # 判斷讀寫(xiě)操作 if self._flushing: # 寫(xiě)操作 ,使用主數(shù)據(jù)庫(kù) print('寫(xiě)入數(shù)據(jù)') return state.db.get_engine(self.app, bind=’master’) else: # 讀操作, 使用從數(shù)據(jù)庫(kù) print(’讀取數(shù)據(jù)’) return state.db.get_engine(self.app, bind=’slave’)
自定義SQLAlchemy類(lèi),重寫(xiě)create_session方法,并在其內(nèi)使用自定義的Session類(lèi)。
class RoutingSQLAlchemy(SQLAlchemy): def create_session(self, options): return orm.sessionmaker(class_=RoutingSession, db=self, **options)
接下來(lái)創(chuàng)建app實(shí)例,配置數(shù)據(jù)庫(kù)的監(jiān)聽(tīng)文件, 然后創(chuàng)建db連接對(duì)象就可以了。
app = Flask(__name__)# 設(shè)置數(shù)據(jù)庫(kù)的連接地址app.config[’SQLALCHEMY_DATABASE_URI’] = ’mysql://root:mysql@192.168.105.134:3306/demo’# 設(shè)置數(shù)據(jù)庫(kù)的綁定地址app.config[’SQLALCHEMY_BINDS’] = { ’master’: 'mysql://root:mysql@192.168.105.134:3306/demo', ’slave’: 'mysql://root:mysql@192.168.105.134:8306/demo'}# 設(shè)置是否追蹤數(shù)據(jù)庫(kù)變化 一般不會(huì)開(kāi)啟, 影響性能app.config[’SQLALCHEMY_TRACK_MODIFICATIONS’] = False# 設(shè)置是否打印底層執(zhí)行的SQL語(yǔ)句app.config[’SQLALCHEMY_ECHO’] = False # 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象db = RoutingSQLAlchemy(app)
那么這些就是Python的讀寫(xiě)分離操作,你學(xué)會(huì)了嗎?
以上就是Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離的示例的詳細(xì)內(nèi)容,更多關(guān)于python MySQL讀寫(xiě)分離的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
