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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索