點擊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學習交流微信羣,請後臺回覆「入羣」
往期推薦
大型fastapi項目實戰 靠 python 中間件解決方案漲薪了
大型fastapi項目實戰 高併發請求神器之aiohttp(下)
大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]
本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。