使用异步ORM SQLAlchemy提升web服务性能

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

介绍

对于一个web服务,性能的瓶颈最终基本上都会出现在数据库读取的这一步上,如果能够在数据库读取数据的这一段时间自动切换去处理其他请求的话,服务的性能会得到非常显著的提升,因此需要选择一个合适的异步驱动和工具包

SQLAlchemy是一个python中发展比较成熟的ORM数据库工具包,在比较早期的时候它只是一个同步ORM,在1.4版本的时候引入了协程并支持了异步的功能,下面以最通用和常用为出发点,选择aiomysql + sqlalchemy介绍一些比较好的实践

本篇文章内容主要包含:

  1. SQLAlchemy的一些用法和最佳实践介绍
  2. 一个使用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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值