Python web框架(django,flask)實現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例
讀寫分離,顧名思義,我們可以把讀和寫兩個操作分開,減輕數(shù)據(jù)的訪問壓力,解決高并發(fā)的問題。
那么我們今天就Python兩大框架來做這個讀寫分離的操作。
1.Django框架實現(xiàn)讀寫分離
Django做讀寫分離非常的簡單,直接在settings.py中把從機加入到數(shù)據(jù)庫的配置文件中就可以了。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 主服務(wù)器的運行ip 'PORT': 3306, # 主服務(wù)器的運行port 'USER': 'django_master', # 主服務(wù)器的用戶名 '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' } }
在項目的app文件中創(chuàng)建db_route.py文件,直接在文件里定義一個數(shù)據(jù)庫路由類,用以區(qū)分讀寫操作。
"""數(shù)據(jù)庫讀寫路由""" 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): """是否運行關(guān)聯(lián)操作""" return True
最后我們在settings.py中寫個路由配置就可以了。
DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]
Flask框架實現(xiàn)讀寫分離
首先自定義Session類,重寫get_bind方法,根據(jù)self.flushing判斷讀寫操作,選擇對應(yīng)的數(shù)據(jù)庫。
from flask import Flask from flask_sqlalchemy import SQLAlchemy, SignallingSession, get_state from sqlalchemy import orm class RoutingSession(SignallingSession): def get_bind(self, mapper=None, clause=None): state = get_state(self.app) # 判斷讀寫操作 if self._flushing: # 寫操作 ,使用主數(shù)據(jù)庫 print("寫入數(shù)據(jù)") return state.db.get_engine(self.app, bind='master') else: # 讀操作, 使用從數(shù)據(jù)庫 print('讀取數(shù)據(jù)') return state.db.get_engine(self.app, bind='slave')
自定義SQLAlchemy類,重寫create_session方法,并在其內(nèi)使用自定義的Session類。
class RoutingSQLAlchemy(SQLAlchemy): def create_session(self, options): return orm.sessionmaker(class_=RoutingSession, db=self, **options)
接下來創(chuàng)建app實例,配置數(shù)據(jù)庫的監(jiān)聽文件, 然后創(chuàng)建db連接對象就可以了。
app = Flask(__name__) # 設(shè)置數(shù)據(jù)庫的連接地址 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@192.168.105.134:3306/demo' # 設(shè)置數(shù)據(jù)庫的綁定地址 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ù)庫變化 一般不會開啟, 影響性能 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 設(shè)置是否打印底層執(zhí)行的SQL語句 app.config['SQLALCHEMY_ECHO'] = False # 創(chuàng)建數(shù)據(jù)庫連接對象 db = RoutingSQLAlchemy(app)
那么這些就是Python的讀寫分離操作,你學(xué)會了嗎?
以上就是Python web框架(django,flask)實現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例的詳細(xì)內(nèi)容,更多關(guān)于python MySQL讀寫分離的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于numpy中eye和identity的區(qū)別詳解
今天小編就為大家分享一篇關(guān)于numpy中eye和identity的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用python爬取連續(xù)降水?dāng)?shù)據(jù)信息實例
這篇文章主要為大家介紹了使用python提取連續(xù)降水?dāng)?shù)據(jù)信息實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01用Python實現(xiàn)web端用戶登錄和注冊功能的教程
這篇文章主要介紹了用Python實現(xiàn)web端用戶登錄和注冊功能的教程,需要的朋友可以參考下2015-04-04numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法
今天小編就為大家分享一篇numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08python3用PyPDF2解析pdf文件,用正則匹配數(shù)據(jù)方式
這篇文章主要介紹了python3用PyPDF2解析pdf文件,用正則匹配數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作指南
對于開發(fā)一個游戲來說,窗口的顯示肯定是前提中的前提,對于pygame來說,只需要一小段代碼就可以初始化窗口,下面這篇文章主要給大家介紹了關(guān)于pygame自定義窗口創(chuàng)建及相關(guān)操作的相關(guān)資料,需要的朋友可以參考下2022-07-07