python模块之 aiomysql 异步mysql

这篇具有很好参考价值的文章主要介绍了python模块之 aiomysql 异步mysql。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysql安装教程
mysql语法大全
python 模块pymysql模块,连接mysql数据库

一、介绍

aiomysql 是一个基于 asyncio 的异步 MySQL 客户端库,用于在 Python 中与 MySQL 数据库进行交互。它提供了异步的数据库连接和查询操作,适用于异步编程环境文章来源地址https://www.toymoban.com/news/detail-697206.html

  1. 异步支持:aiomysql 是基于 asyncio 实现的,可以与 asyncio 框架无缝集成,充分利用异步编程的优势,提高应用程序的性能和并发能力。
  2. 高性能:aiomysql 使用了底层的 PyMySQL 库,通过异步操作和连接池技术,可以实现高性能的数据库访问。
  3. 支持事务:aiomysql 提供了事务管理的支持,可以执行原子性的数据库操作,保证数据的一致性。
  4. SQL 语句构建器:aiomysql 提供了一个 SQL 语句构建器,可以方便地构建和执行 SQL 查询。
二、安装
pip install aiomysql
三、方法及属性
  1. aiomysql.connect():连接mysql,conn = await aiomysql.connect(host=‘localhost’, port=3307, user=‘root’, password=‘root’)
  • host:MySQL 服务器的主机名或 IP 地址。
  • port:MySQL 服务器的端口号,默认为 3306。
  • user:连接 MySQL 服务器的用户名。
  • password:连接 MySQL 服务器的密码。
  • db:连接的数据库名称。
  • unix_socket:UNIX 域套接字路径。如果指定了 unix_socket,则会忽略 host 和 port 参数。
  • charset:连接的字符集,默认为 “utf8mb4”。
  • autocommit:自动提交模式,默认为 False。如果设置为 True,则每个 SQL 语句都会自动提交。
  • connect_timeout:连接超时时间(以秒为单位),默认为 10 秒。
  • maxsize:连接池中的最大连接数,默认为 10。
  • minsize:连接池中的最小连接数,默认为 1。
  • ssl:SSL 配置参数。可以传入一个字典,包含 SSL 相关的配置选项,如 ssl={‘cert’: ‘/path/to/cert.pem’, ‘key’: ‘/path/to/key.pem’}。
  • loop:事件循环对象。如果不指定,将使用默认的事件循环。
  • pool_recycle:连接池中连接的回收时间(以秒为单位)。当连接在连接池中的时间超过 pool_recycle 时,连接将被回收并重新创建。
  • echo:是否打印 SQL 语句,默认为 False。如果设置为 True,则会在控制台打印执行的 SQL 语句。
  • cursorclass:游标类,默认为 aiomysql.cursors.DictCursor,返回的查询结果将以字典形式返回。
  • server_public_key:服务器公钥,用于 SSL/TLS 连接的服务器验证。
  1. aiomysql.create_pool():创建一个连接池。该方法用于创建一个异步连接池,接受一系列的连接参数,例如数据库主机、端口、用户名、密码等。pool = await aiomysql.create_poo(host=‘localhost’, port=3307, user=‘root’, password=‘root’)
  • host:MySQL 服务器的主机名或 IP 地址。
  • port:MySQL 服务器的端口号,默认为 3306。
  • user:连接 MySQL 服务器的用户名。
  • password:连接 MySQL 服务器的密码。
  • db:连接的数据库名称。
  • unix_socket:UNIX 域套接字路径。如果指定了 unix_socket,则
    忽略 host 和 port 参数。
  • charset:连接的字符集,默认为 “utf8mb4”。
  • autocommit:自动提交模式,默认为 False。如果设置为 True,则每个 SQL 语句都会自动提交。
  • minsize:连接池中的最小连接数,默认为 1。
  • maxsize:连接池中的最大连接数,默认为 10。
  • connect_timeout:连接超时时间(以秒为单位),默认为 10 秒。
  • pool_recycle:连接池中连接的回收时间(以秒为单位)。当连接在连接池中的时间超过 pool_recycle 时,连接将被回收并重新创建。
  • ssl:SSL 配置参数。可以传入一个字典,包含 SSL 相关的配置选项,如 ssl={‘cert’: ‘/path/to/cert.pem’, ‘key’: ‘/path/to/key.pem’}。
  • loop:事件循环对象。如果不指定,将使用默认的事件循环。
  • echo:是否打印 SQL 语句,默认为 False。如果设置为 True,则会在控制台打印执行的 SQL 语句。
  • cursorclass:游标类,默认为 aiomysql.cursors.DictCursor,返回的查询结果将以字典形式返回。
  • server_public_key:服务器公钥,用于 SSL/TLS 连接的服务器验证
  1. pool.acquire():从连接池中获取一个连接。该方法用于从连接池中获取一个异步连接对象,可以用于执行数据库操作。coon = pool.acquire()
  2. pool.release(coon):释放一个连接。该方法用于将一个连接对象返回到连接池中,以便其他代码可以继续使用。
  3. pool.close() :用于关闭连接池。调用 close() 方法后,连接池将不再接受新的连接请求,并开始关闭池中的所有连接。
  4. pool.wait_closed():用于等待连接池中的所有连接关闭。在调用 close() 方法后,应该调用 wait_closed() 方法来确保所有连接都已关闭,然后才能结束程序。
  5. pool.size:表示连接池的当前大小,即池中当前可用的连接数。
  6. pool.maxsize:表示连接池的最大连接数。当连接池中的连接数达到最大值时,新的连接请求将被阻塞,直到有连接被释放。
  7. pool.minsize:表示连接池的最小连接数。连接池在初始化时会创建最小连接数的连接,并保持这些连接处于活动状态。
  8. conn.close():关闭连接。该方法用于关闭连接,释放资源。
  9. conn.host:MySQL 服务器的主机名或 IP 地址。
  10. conn.port:MySQL 服务器的端口号。
  11. conn.user:连接 MySQL 服务器的用户名。
  12. conn.db:当前连接的数据库名称。
  13. conn.server_status:MySQL 服务器的状态信息。
  14. conn.server_capabilities:MySQL 服务器的功能列表。
  15. conn.client_flag:客户端标志。
  16. conn.insert_id:最近插入行的自增 ID。
  17. conn.warning_count:最近一次执行的 SQL 语句产生的警告数量。
  18. conn.errorhandler:错误处理器。
  19. conn.autocommit:自动提交模式。该属性用于设置是否开启自动提交模式,默认为 False。
  20. conn.charset:字符集。该属性用于设置数据库连接的字符集,默认为 “utf8mb4”。
  21. conn.maxsize:最大连接数。该属性用于设置连接池中的最大连接数,默认为 10。
  22. conn.minsize:最小连接数。该属性用于设置连接池中的最小连接数,默认为 1。
  23. conn.timeout:连接超时时间。该属性用于设置连接的超时时间,默认为 10 秒。
  24. conn.echo:是否打印 SQL 语句。该属性用于设置是否在控制台打印执行的 SQL 语句,默认为 False。
  25. conn.loop:事件循环对象。该属性用于设置要使用的事件循环对象。
  26. conn.connection:当前连接对象。该属性用于获取当前的连接对象。
  27. conn.server_version:MySQL 服务器版本。该属性用于获取 MySQL 服务器的版本信息。
  28. conn.commit():提交事务。该方法用于提交当前事务的操作。
  29. conn.begin():提开始一个事务。
  30. conn.ping():检查连接是否存活。
  31. conn.select_db(dbName):切换数据库
  32. conn.escape_string(string):对字符串进行 MySQL 转义。
  33. conn.rollback():回滚事务。该方法用于回滚当前事务的操作。
  34. conn.cursor():创建一个游标对象。该方法用于创建一个异步游标对象,用于执行 SQL 查询和操作。cursor=conn.cursor()
  35. cursor.close():关闭游标对象
  36. cursor.execute(sql, args=None):执行 SQL 语句。该方法用于执行 SQL 语句,接受 SQL 语句字符串和参数,可以执行查询、插入、更新等操作。
  37. cursor.executemany(sql, args=None):执行多个 SQL 语句。该方法用于执行多个相同结构的 SQL 语句,接受 SQL 语句字符串和参数列表。
  38. cursor.fetchone():获取一条查询结果。该方法用于获取查询结果的下一行数据。
  39. cursor.fetchall():获取所有查询结果。该方法用于获取查询结果的所有行数据。
  40. cursor.fetchmany(size=None):获取查询结果的多行。
  41. cursor.rowcount:最近一次执行的 SQL 语句影响的行数。
  42. cursor.lastrowid:最近插入行的自增 ID。
  43. cursor.description:查询结果的字段描述信息。
  44. cursor.rownumber:当前行在查询结果中的索引。
  45. cursor.arraysize:获取或设置从数据库获取的行数。
四、案例
  1. 基本使用 aiomysql.connect()
    import aiomysql
    import asyncio
    
    
    async def main():
        conn = await aiomysql.connect(host='localhost', port=3306, user='root', password='root',db='job')
        cursor = await conn.cursor()
        await cursor.execute('SELECT * FROM baidu_job;')
        result = await cursor.fetchall()
        print(result)
        await cursor.close()
        conn.close()
    
    
    asyncio.run(main())
    
  2. 连接池 aiomysql.create_pool(),建议使用连接池
    import aiomysql
    import asyncio
    
    async def main():
        pool = await aiomysql.create_pool(host='localhost', port=3306, user='root', password='root',db='job')
        async with pool.acquire() as conn:
            async with conn.cursor() as cursor:
                await cursor.execute('SELECT * FROM baidu_job;')
                result = await cursor.fetchall()
                print(result)
    
    asyncio.run(main())
    
  3. 连接池爬取汽车之家数据
    '''
    网址:https://www.che168.com/china/a0_0msdgscncgpi1ltocsp7exf4x0/?pvareaid=102179#currengpostion
    '''
    
    import asyncio
    import aiohttp
    import aiomysql
    from lxml import etree
    import random
    
    
    class Car:
        url = {
            'car_list': 'https://www.che168.com/china/a0_0msdgscncgpi1ltocsp{}exf4x0/?pvareaid=102179#currengpostion',
            'car_detail': 'https://cacheapigo.che168.com/CarProduct/GetParam.ashx?specid={}'
        }
    
        headers = {
            'authority': 'www.che168.com',
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cache-control': 'no-cache',
            'pragma': 'no-cache',
            'referer': 'https://www.che168.com/dealer/481320/48787661.html?pvareaid=100519&userpid=0&usercid=0&offertype=&offertag=0&activitycartype=0&fromsxmlist=0',
            'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"',
            'sec-fetch-dest': 'document',
            'sec-fetch-mode': 'navigate',
            'sec-fetch-site': 'same-origin',
            'sec-fetch-user': '?1',
            'upgrade-insecure-requests': '1',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
        }
    
        def __init__(self):
            self.pool = None
            self.request = None
    
        '''获取汽车列表'''
        async def get_car_list(self, page):
            print(self.url['car_list'].format(page))
            response = await self.request.get(self.url['car_list'].format(page))
            result = await response.text(encoding='GBK')
            return etree.HTML(result)
    
        '''处理汽车列表信息'''
        async def parse_car_list_info(self, html):
            car_list_html = html.xpath('//div[@id="goodStartSolrQuotePriceCore0"]//li[@name="lazyloadcpc"]')
            task_list = []
            for item in car_list_html:
                car_info = {
                    'specid': item.xpath('./@specid')[0],
                    'infoid': item.xpath('./@infoid')[0]
                }
                task = asyncio.create_task(self.get_car_detail(car_info))
                task_list.append(task)
            await asyncio.wait(task_list)
    
        '''获取第一页数据,并返回总页数'''
        async def get_first_page(self):
            html = await self.get_car_list(1)
            page_total = html.xpath('//div[@id="listpagination"]/a[last()-1]/text()')[0]
            await self.parse_car_list_info(html)
            return int(page_total)
    
        '''获取除第一页数据之外的其他页数据'''
        async def get_all_page(self,page):
            async with self.semaphore:
                await asyncio.sleep(random.randint(500, 800) / 1000)
                html = await self.get_car_list(page)
                await self.parse_car_list_info(html)
    
        '''获取汽车详情'''
        async def get_car_detail(self, car_info):
            response = await self.request.get(self.url['car_detail'].format(car_info['specid']))
            result = await response.json()
            detail = result['result']['paramtypeitems']
            car_detail = {
                'specid': car_info['specid'],
                'infoid': car_info['infoid'],
                'name': detail[0]['paramitems'][0]['value'],
                'price': detail[0]['paramitems'][1]['value'],
                'manufacturer': detail[0]['paramitems'][2]['value'],
                'level': detail[0]['paramitems'][3]['value'],
                'length': f'{detail[1]["paramitems"][0]["value"]}mm',
                'width': f'{detail[1]["paramitems"][1]["value"]}mm',
                'height':f'{detail[1]["paramitems"][2]["value"]}mm',
            }
            await self.insert_table(car_detail)
    
        '''异步建立mysql表'''
        async def create_table(self):
            sql = '''
            CREATE TABLE IF NOT EXISTS qichezhijia(
            Id INT UNIQUE,
            Specid INT,
            Name VARCHAR(255),
            Price VARCHAR(10),
            Manufacturer VARCHAR(255),
            Level VARCHAR(50),
            Length VARCHAR(10),
            Width VARCHAR(10),
            Height VARCHAR(10),
            PRIMARY KEY(Id)
            )
            '''
            async with self.pool.acquire() as conn:
                async with conn.cursor() as cursor:
                    try:
                        await cursor.execute(sql)
                    except Exception as e:
                        print(f'创建表失败{e}')
    
        '''插入数据'''
        async def insert_table(self,car_detail):
            sql = '''
            INSERT INTO qichezhijia VALUES(%(infoid)s,%(specid)s,%(name)s,%(price)s,%(manufacturer)s,%(level)s,%(length)s,%(width)s,%(height)s)
            '''
            async with self.pool.acquire() as conn:
                async with conn.cursor() as cursor:
                    try:
                        await cursor.execute(sql, car_detail)
                        await conn.commit()
                        print('数据插入成功')
                    except Exception as e:
                        print(f'插入数据失败{e},infoid={car_detail["infoid"]}')
    
        '''程序运行主函数'''
        async def main(self):
            async with aiomysql.create_pool(host='localhost', port=3306, user='root', password='root', db='car') as pool:
                self.pool = pool
                await self.create_table()
                async with aiohttp.ClientSession(headers=self.headers) as request:
                    self.request = request
                    page_total = await self.get_first_page()
                    self.semaphore = asyncio.Semaphore(3)
                    task_list = []
                    for page in range(2,page_total+1):
                        task = asyncio.create_task(self.get_all_page(page))
                        task_list.append(task)
                    await asyncio.wait(task_list)
    
    
    if __name__ == '__main__':
        car = Car()
        asyncio.run(car.main())
    

到了这里,关于python模块之 aiomysql 异步mysql的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog功能模块——读写位宽不同的异步FIFO

    FIFO系列文章目录: Verilog功能模块——异步FIFO-CSDN博客 Verilog功能模块——同步FIFO-CSDN博客 Verilog功能模块——读写位宽不同的异步FIFO-CSDN博客 Verilog功能模块——读写位宽不同的同步FIFO-CSDN博客 Verilog功能模块——标准FIFO转FWFT FIFO-CSDN博客 前面的博文已经讲了异步FIFO和同步

    2024年02月01日
    浏览(44)
  • React16源码: React中的异步调度scheduler模块的源码实现

    React Scheduler 1 ) 概述 react当中的异步调度,称为 React Scheduler 发布成单独的一个 npm 包就叫做 scheduler 这个包它做了什么? A. 首先它维护时间片 B. 然后模拟 requestIdleCallback 这个API 因为现在浏览器的支持不是特别的多 所以在浏览当中只是去模拟了一个这个API,而不是直接使用这

    2024年01月18日
    浏览(44)
  • Vue中JSON文件神奇应用fetch、axios异步加载与模块导入全指南

      在Vue中使用JSON文件有多种方式,包括使用 fetch 方法加载JSON文件、使用 axios 库加载JSON文件,以及将JSON文件导入为模块。以下是详细描述和相应的示例代码: 创建一个 JSON 文件,例如  data.json : 在Vue组件中使用  fetch  方法加载 JSON 文件: 安装  axios  库: 在Vue组件中使

    2024年02月19日
    浏览(44)
  • 【MySQL】主从异步复制配置

    您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦 。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏,系统性的学习

    2024年02月03日
    浏览(39)
  • MySQL与ES数据同步之异步调用

    上一篇是同步调用,我们在中间加上MQ就可以实现异步调用,这种方式性能高,不易出现数据丢失问题,多源写入之间相互隔离,便于扩展更多的数据源写入。 同时也会带来一些问题,首先还是代码侵入强,其次系统复杂度会增加,因为引入了消息中间件 可能出现延时问题:

    2024年02月09日
    浏览(35)
  • 一、Flink使用异步算子+线程池查询MySQL

    目录 Flink异步算子使用介绍 使用Flink异步算子+多线程异步查询MySQL 相关阅读 1 Flink使用异步算子请求高德地图获取位置信息 1、概述 1)Flink异步算子使用介绍 1.异步与同步概述 同步:向数据库发送一个请求然后一直等待,直到收到响应。在许多情况下,等待占据了函数运行的

    2024年02月14日
    浏览(43)
  • MySQL 主从复制[异步 同步 半同步复制] 读写分离 优化 (非常重要)

    1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么要读写分离呢? 因为数据库的“写”(写10000条数据

    2024年02月11日
    浏览(54)
  • Python异步编程之web框架 异步vs同步 Redis并发对比

    主题: 比较异步框架和同步框架在RedisIO操作的性能差异 python版本 :python 3.8 数据库 :redis 5.0.7 压测工具 :locust web框架 :同步:flask 异步:starlette 请求并发量 : 模拟10个用户 服务器配置 : Intel(R) i7-12700F 客户端配置 :Intel(R) i7-8700 3.20GHz flask是python中轻量级web框架,特点是灵

    2024年02月10日
    浏览(46)
  • Python爬虫 异步、缓存技巧

    在进行大规模数据抓取时,Python爬虫的速度和效率是至关重要的。本文将介绍如何通过异步请求、缓存和代理池等技巧来优化Python爬虫的速度和性能。我们提供了实用的方案和代码示例,帮助你加速数据抓取过程,提高爬虫的效率。 使用异步请求、缓存和代理池等技巧可以带

    2024年02月11日
    浏览(24)
  • 浅谈Python异步编程

    异步编程是一种编程范式,用于处理那些需要等待I/O操作完成或者耗时任务的情况。在传统的同步编程中,代码会按照顺序逐行执行,直到遇到一个耗时操作,它会阻塞程序的执行直到操作完成。这种阻塞式的模型在某些场景下效率低下,因为代码在等待操作完成时无法执行

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包