介绍
对于一个web服务,性能的瓶颈最终基本上都会出现在数据库读取的这一步上,如果能够在数据库读取数据的这一段时间自动切换去处理其他请求的话,服务的性能会得到非常显著的提升,因此需要选择一个合适的异步驱动和工具包
SQLAlchemy是一个python中发展比较成熟的ORM数据库工具包,在比较早期的时候它只是一个同步ORM,在1.4版本的时候引入了协程并支持了异步的功能,下面以最通用和常用为出发点,选择aiomysql + sqlalchemy介绍一些比较好的实践
本篇文章内容主要包含:
- SQLAlchemy的一些用法和最佳实践介绍
- 一个使用SQLAlchemy连接实现pandas的异步read_sql_query方法的实现(也是对上一篇文章末尾提的建议做一个结束)
创建异步引擎并执行SQL查询
from sqlalchemy.engine import URL
from sqlalchemy.ext.asyncio import create_async_engine, AsyncEngine
engine: AsyncEngine = create_async_engine(
URL.create("mysql+aiomysql", "root", "root", "localhost", 3306, "mysql"),
)
创建方式和同步的create_engine()方法没有很大的差别,参数都是一样的
创建好查询引擎之后,接下来使用创建的引擎操作数据库读取数据
# -*- coding: utf-8 -*-
import asyncio
from sqlalchemy import text
from sqlalchemy.engine import URL
from sqlalchemy.ext.asyncio import create_async_engine, AsyncEngine
loop = asyncio.get_event_loop()
engine: AsyncEngine = create_async_engine(
URL.create("mysql+aiomysql", "root", "root", "localhost", 3306, "services"),
)
# test_table:
# id name value
# 0 1 abc 123
# 1 2 def 456
# 2 3 fgi 789
# 3 4 fdsas 654
# 4 5 asda 111
async def get_data():
async with engine.connect() as conn:
# query = text("select * from test_table where id > :id or id = :id2").bindparams(id=3, id2=1)
query = text("select * from test_table").bindparams(**{
})
result = await conn.execute(query)
ttl = result.rowcount
print(f"总行数:{
ttl}")
data = result.fetchone()
print(data, type(data)) # 获取到的data是一个Row对象
print(dict(data)) # 可以直接转成字典
length = 1
print(f"进度:{
length / ttl}")
# 继续fetchone()会从下一条数据开始获取
data = result.fetchone()
print(data)
length += 1
print(f"进度:{
length / ttl}")
data = result.fetchmany(2)
print(data)
# 将数据转成比较通用的"records"格式
print(list(map(dict, data)))
length += len(data)
print(

本文介绍了如何使用Python的SQLAlchemy库配合aiomysql实现异步数据库操作,并展示了如何创建异步数据库引擎及执行SQL查询。通过示例展示了异步读取数据、使用占位符以及实现异步的pandas read_sql_query方法,从而提升web服务性能。
最低0.47元/天 解锁文章
66

被折叠的 条评论
为什么被折叠?



