python 大型项目实战 0 基础异步操作 mysql 5 倍性能提升案例
点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达
读完需要8分钟
速读仅需 3 分钟
/ python 大型项目实战 0 基础异步操作 mysql 5 倍性能提升案例 /
注:这篇文章核心是介绍 python 中异步使用 mysql 涉及到的文件会比较多,但我保证你看完后能快速使用在自己的项目中来提升并发读写性能。
1
背景介绍
在平时的开发中你是否会收到来自不同方的抱怨?
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 databases
You 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 Database
database = 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 databases
import settings
from typing import Any, Dict
haishiniu_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 FastAPI
from connector import db_mysql_haishiniu
from get_table_info import haishiniu_sql
app = 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源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
云空调,GitHub 的专属冷气——GitHub 热点速览 v.21.20
作者:HelloGitHub-小鱼干 万物皆可上云,air-conditioner 是上周火爆小鱼干朋友圈和公众号信息流的云空调项目。第一眼的时候,你会觉得和这个云空调还挺别致的,第二眼,si~~感到了一丝丝的“冷”,为项目作者的脑洞打了个冷颤。此外,Lima 也有点“冷”,它是一个 macOS Linux 子系统,简单来说是一个 Linux 虚拟机…真的有点“冷”幽默在里面。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 1. 本周特推 在开始本周的特推之前,如果你有什么想要的 GitHub 项目,记得留言呀~你的留言超重要 (≧▽≦) 1.1 云空调:air-conditioner 本周 star 增长数:1,750+ 进入到夏天,你除了能感受到热之外,还有什么?冷气...
- 下一篇
MySQL性能优化(四):如何高效的使用索引
正确地创建和使用索引是实现高性能查询的基础。前面文章MySQL性能优化(三):深入理解索引的这点事已经介绍了各种类型的索引及其特点,而在实际使用索引中,如何真正有效地发挥索引的价值,还需要进一步持续不断地学习、磨练。接下来本篇文章将分享如何高效、正确的使用索引。 实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作的,就可以了。在后续使用索引,或者优化索引时,可以从这些方面出发,进一步来加深对索引正确高效的使用。 一、索引失效 索引失效,是一个老生常谈的话题了。只要提到数据库优化、使用索引,都能一口气说出一大堆索引失效的场景,什么不能用、什么不该用这类的话,在此,我就不再一一罗列啰嗦了。 索引失效,是指表中有字段创建了索引,由于sql语句书写不当导致索引失效的情况。 在sql语句中,将索引列作为表达式的一部分、参与函数/数学等运算,将会导致索引失效。 例如,下面这个查询无法使用age列的索引: select id,name,age from t_user where age + ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作