python模块之 aiomysql 异步mysql

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

一、介绍

aiomysql 是一个基于 asyncio 的异步 MySQL 客户端库,用于在 Python 中与 MySQL 数据库进行交互。它提供了异步的数据库连接和查询操作,适用于异步编程环境

  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 asyncioasync 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 asyncioasync 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 randomclass 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 = Noneself.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 = poolawait self.create_table()async with aiohttp.ClientSession(headers=self.headers) as request:self.request = requestpage_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())
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络(一):基础篇

文章目录 1. TCP/IP网络模型有哪几层并做简要介绍?2. 键入网址到网页显示,期间发生了什么?3. 介绍一下域名解析的工作流程?4. MAC发送方和接收方如何确认?5. 路由器和交换机的区别?6. Linux系统是如何收发网…

sqlserver union和union all 的区别

1.首先在数据库编辑1-40数字&#xff1b; 2.查询Num<30的数据&#xff0c;查询Num>20 and Num<40的数据&#xff0c;使用union all合并&#xff1b; 发现30-20的数字重复了&#xff0c;可见union all 不去重&#xff1b; 3.查询Num<30的数据&#xff0c;查询Num…

表的内连接和外连接

表的连接是SQL中的一种操作&#xff0c;用于将两个或多个表中的数据按照某个条件进行关联。 内连接 使用内连接将两个表(Table1 和 Table2)进行连接&#xff1a; select * from Table1 inner join Table2 on Table1.id Table2.id;举例&#xff1a; -- 用普通的写法 select…

idea右边找不到maven窗口(Idea_最右侧常用栏中没有Maven选项)

方案一&#xff1a; 首先idea自带了maven控件&#xff0c;不像Eclipse还需要下载控件&#xff0c;如果你以前有maven在右边&#xff0c;出于某种原因&#xff0c;消失找不到 了&#xff0c;你可以试试我写的方法。 方法1.你点击一下你idea界面最左下角的那个小框&#xff0c…

Promise 解决 Vue 中父子组件的加载问题!

前言 关于Promie我这里就不多解释了&#xff0c;不懂得可以看看官方文档。下面文章重点介绍项目中遇到的问题解决方法。 需求 组件b初始化某个用到的库&#xff0c;只有在初始化完成后才能调用其API&#xff0c;不然会报错。a页面负责调用。 // a.vue <template><d…

动态表单设计

动态表单设计 背景方案讨论基于上面分析&#xff0c;对比调研&#xff0c;自定义动态表单数据模型表单详解&#xff08;一&#xff09; 表单模板&#xff1a;jim_dynamic_form&#xff08;二&#xff09;表单数据类型&#xff1a;jim_form_data_type&#xff08;三&#xff09;…

element ui el-table分页多选功能

selection-change&#xff1a;当选择项发生变化时会触发该事件&#xff08;当分页切换时&#xff0c;选中的数据都会自动清空&#xff09; 一、在el-table中添加 :row-key“id” <el-table :data"tableData" border style"width: 95%" selection-change…

【Linux】编辑器 vim

1、vim的基本概念 vi/vim【一款文本编辑器】vim【一款多模式编辑器】vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0…

redis-win10安装和解决清缓存报错“Error: Protocol error, got “H“ as reply type byte”

win10安装 https://github.com/microsoftarchive/redis/releases 下载最新的zip&#xff0c;解压&#xff0c;把路径加到Path里&#xff0c;每次直接在cmd里 redis-server.exeError: Protocol error, got “H” as reply type byte 这个报错是因为我端口写错了。。无语 D:…

分享一个python实验室设备预约管理系统 实验室设备维修系统源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

DAY08_MyBatisPlus——入门案例标准数据层开发CRUD-Lombok-分页功能DQL编程控制DML编程控制乐观锁快速开发-代码生成器

目录 一 MyBatisPlus简介1. 入门案例问题导入1.1 SpringBoot整合MyBatisPlus入门程序①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息②&#xff1a;选择当前模块需要使用的技术集&#xff08;仅保留JDBC&#xff09;③&#xff1a;手…

《VulnHub》DarkHole:1

VulnHub 1&#xff1a;靶场信息2&#xff1a;打靶2.1&#xff1a;情报收集&威胁建模2.2&#xff1a;漏洞分析&渗透攻击 3&#xff1a;总结3.1&#xff1a;命令&工具3.1.1&#xff1a;Nmap 3.2&#xff1a;关键技术 VulnHub 打靶记录。官网&#xff1a;https://www.…

Android -BLE 蓝牙模块开发

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码) - 简书前言 万物互联的物联网时代的已经来临&#xff0c;ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点&#xff0c;抽时间梳理下这块的知识点。 涉及ble蓝牙通讯的客户端(开启、扫描、连接…

Web framework-Gin(二)

目录 一、Gin 1、Ajax 2、文件上传 2.1、form表单中文件上传(单个文件) 2.2、form表单中文件上传(多个文件) 2.3、ajax上传单个文件 2.4、ajax上传多个文件 3、模板语法 4、数据绑定 5、路由组 6、中间件 一、Gin 1、Ajax AJAX 即“Asynchronous Javascript And XM…

时序分解 | MATLAB实现ICEEMDAN+SE改进的自适应经验模态分解+样本熵重构分量

时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 目录 时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 包括频谱图 避…

网络协议百科全书:28张图带你搞懂TCP

大家好&#xff0c;我的网工朋友。 不仅仅是网工&#xff0c;只要你是做IT相关的工作&#xff0c;肯定都离不开网络。 那网络中最重要的协议&#xff0c;大概非TCP莫属&#xff0c;谁去面试没被问过网络协议的相关问题&#xff1f; 谁没买过那本最经典的《TCP/IP详解》 。 …

可靠又稳定些的微信管理系统

微信管理系统 --- 简单点说就是&#xff1a;微信的管理和营销系统。再通俗一些就是&#xff1a;利用微信与管理营销相结合的一种新型的办公方式。 不用下载任何软件&#xff0c;不需要多部手机&#xff0c;对手机型号没有任何要求&#xff0c;不需要刷机等等&#xff0c;并且稳…

前端性能优化方法

1.压缩和优化资源&#xff1a; 压缩CSS、JavaScript和图像文件&#xff0c;减小文件大小。 使用工具如Webpack、Parcel或Rollup来捆绑和优化资源。 2.使用CDN&#xff08;内容分发网络&#xff09;&#xff1a; 将静态资源托管在CDN上&#xff0c;加速资源的…

案例:实现TodoLis(尚硅谷)

是做完后再记录的&#xff0c;前端我主要是要了解下&#xff0c;所以这里记录的比较浅 由于是做完后记录&#xff0c;所以你cv后的代码的效果并不一定和我展示的效果图一样 静态页面 先来实现静态页面&#xff0c;再考虑动态页面 组件拆分 说明(实际的组件名不是和下面一样的…

手写Mybatis:第15章-返回Insert操作自增索引值

文章目录 一、目标&#xff1a;Insert自增索引值二、设计&#xff1a;Insert自增索引值三、实现&#xff1a;Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…