python 大型項目實戰 0 基礎異步操做 mysql 5 倍性能提高案例

點擊python編程從入門到實踐置頂 公衆號重磅 python入門資料,第一時間送達python

 

 

                            

                             

 

讀完須要8分鐘mysql

速讀僅需 3 分鐘面試

/ python 大型項目實戰 0 基礎異步操做 mysql 5 倍性能提高案例 /sql

 

注:這篇文章核心是介紹 python 中異步使用 mysql 涉及到的文件會比較多,但我保證你看完後能快速使用在本身的項目中來提高併發讀寫性能。數據庫

1編程

背景介紹api

在平時的開發中你是否會收到來自不一樣方的抱怨?
eg1:
運營 1:"哎,咱們的後臺刷新一個頁面怎麼就這麼慢呀,讓它快點呀,總是在這裏轉圈圈,我......"
你:"哦,知道啦。我再看看"。此時的你也在思考,內心想:我設計的表也沒問題了呀,也加索引了呀,可就仍是慢,我要再也不加大一下線程池?要不加一下 cache?
eg2:
領導 1:"小王呀,我看線上監控,你那邊負責的項目中讀庫的性能不好呀,分析一下拿出一個優化方案"
你:"好的,領導我知道了,我追蹤一下",雖硬着頭皮應下來了不過此時你心裏在想:"領導,我看了半天也是頭大,沒辦法再優化了"。
......
筆者在與面試者溝通的過程當中會常常問一個問題:"如今頁面發現加載數據很慢,如果你會從那些方面去思考和解決這方面的問題呢?"
能很系統的回答這個問題的面試者寥寥無幾,本篇咱們不是系統的介紹如何進行優化系統,只是介紹一種提升併發的一種解決方案(業務讀寫數據層面)
微信

2閉包

基礎必備知識併發

2.1

databases 簡單介紹

首先,咱們要介紹一下 databases 模塊,咱們先看一下官方介紹:
1.Databases gives you simple asyncio support for a range of databases.
2.Databases is suitable for integrating against any async Web framework, such as Starlette, Sanic, Responder, Quart, aiohttp, Tornado, or FastAPI.
3.Requirements: Python 3.6+

一句話總結:在 fastapi 中 咱們能夠經過 Databases 來達到異步操做數據庫的目的

2.2

databases 安裝


$ pip install databasesYou can install the required database drivers with:$ pip install databases[postgresql]$ pip install databases[mysql]$ pip install databases[sqlite]

2.3

databases 案例







# install# $ pip install databases[sqlite]# Create a database instance, and connect to it.from databases import Databasedatabase = Database('sqlite:///example.db')await database.connect()# Create a table.query = """CREATE TABLE HighScores (id INTEGER PRIMARY KEY, name VARCHAR(100), score INTEGER)"""await database.execute(query=query)# Insert some data.query = "INSERT INTO HighScores(name, score) VALUES (:name, :score)"values = [ {"name": "Daisy", "score": 92}, {"name": "Neil", "score": 87}, {"name": "Carol", "score": 43},]await database.execute_many(query=query, values=values)# Run a database query.query = "SELECT * FROM HighScores"rows = await database.fetch_all(query=query)print('High Scores:', rows)

咱們能夠看到在操做數據庫的過程當中不管是鏈接數據庫仍是進行 CURD 都是加入了關鍵字 await ,咱們知道在 python3.6+以後 經過官方提供的 async/await 來處理異步的解決方案,so 咱們就知道了 能夠使用 databases 來達到異步處理數據的目的

3

fastapi 中引入 databases

3.1

配置數據庫的基礎信息

首先咱們須要在進行配置數據庫的基礎信息,包括鏈接的域名、端口、用戶名、密碼等等。


# 內容放置在 settings.py 文件中DATABASES = { 'haishiniu_database': { 'url': 'mysql://user1:password1@127.0.0.1:3306/haishiniu_test', 'host': '127.0.0.1', 'port': 3306, 'user': 'user1', 'password': 'password1', 'db': 'haishiniu', 'options': { 'init_command': 'SET foreign_key_checks = 0;', 'charset': 'utf8mb4', 'min_size': 1, 'max_size': 8, 'pool_recycle': 100, } }}

 

3.2

基於配置生成 mysql 數據庫的鏈接句柄




# 放置在 connector.py 文件中import databasesimport settingsfrom typing import Any, Dicthaishiniu_db_settings: Dict[str, Any] = settings.DATABASES["haishiniu_database"]db_mysql_haishiniu = databases.Database( url=haishiniu_db_settings["url"], **haishiniu_db_settings["options"])

這樣就能夠獲得一個數據庫的鏈接/操做 句柄:db_mysql_haishiniu

3.3

在 fastapi 中使用 databases

完成配置、鏈接以後就能夠進行對數據庫進行訪問操做





# 配置在 get_table_info.py 中from dataclasses import dataclass@dataclass(frozen=True)class HaishiniuSQL(object): # 獲取用戶信息sql get_user_info_sql = " select user_name, age, sex from user where user_id =:user_id "haishiniu_sql = HaishiniuSQL()

封裝完成 sql 語句以後咱們再在主邏輯中引用其完成相應的功能






from fastapi import FastAPIfrom connector import db_mysql_haishiniufrom get_table_info import haishiniu_sqlapp = FastAPI()@app.get("/get_user_info/")async def read_user_info(*, user_id: str = None): user_info = await db_mysql_haishiniu.fetch_all( haishiniu_sql.get_user_info_sql, values={"user_id": user_id}, ) return {"user_info": user_info}

以上就完成了一個從配置到最終獲取數據的完整案例,有興趣的小夥伴能夠實踐起來,對此方案的性能有疑惑的小夥伴建議作一下性能測試。若您不清楚如何驗證其性能,能夠在文章下方留言哦,我看需求多的話能夠帶你們一塊兒作一次性能測試。

4

總結

1.介紹了 fastapi 中 如何進行異步的操做經常使用的數據庫
2.經過一個例子完整的展現瞭如何在生產環境中去基於 databases 完成異步操做數據庫

我堅信:思考問題的方法遠大於具體解決問題的方案,讓咱們繼續一路前行,下期再見!

 

原創不易,只願能幫助那些須要這些內容的同行或剛入行的小夥伴,你的每次 點贊分享 都是我繼續創做下去的動力,我但願能在推廣 python 技術的道路上盡我一份力量,歡迎在評論區向我提問,我都會一一解答,記得一鍵三連支持一下哦!

 

加入python學習交流微信羣,請後臺回覆「入羣

 

 

往期推薦

python生產實戰 python 閉包之庖丁解牛篇

大型fastapi項目實戰 靠 python 中間件解決方案漲薪了

大型fastapi項目實戰 高併發請求神器之aiohttp(下)

大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]

 

 

 

本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索