Python数据分析之利用pymysql操作数据库

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: Python数据分析之利用pymysql操作数据库

1 引言


mysql应该说是如今使用最为普遍的数据库了,没有之一,而Python作为最为流行的语言之一,自然少不了与mysql打交道,pymysql就是使用最多的工具库了。


2 创建库、表


我们先从创建数据库、数据表说起,有了库表,后面的增删改查才有根据。


2.1 创建数据库


pymysql的所有对数据库的操作都必须先与数据库服务建立连接,然后创建游标为基础执行具体的sql语句。创建数据库方法如下:


# -*- coding: utf-8 -*-
import pymysql
conn = pymysql.connect( # 创建数据库连接
    host='10.10.11.131', # 要连接的数据库所在主机ip
    user='chb', # 数据库登录用户名
    password='123456!', # 登录用户密码
    charset='utf8' # 编码,注意不能写成utf-8
)
cursor = con.cursor()
cursor .execute("create database test_db character set utf8;")
# 执行完之后别忘了关闭游标和数据库连接
cursor.close()
conn.close()


上面代码执行完后,就创建了一个名为test_db的数据库:


640.png

2.2 创建数据表


# -*- coding: utf-8 -*-
import pymysql
conn = pymysql.connect( # 创建数据库连接
    host='10.10.11.131', # 要连接的数据库所在主机ip
    user='chb', # 数据库登录用户名
    password='123456!', # 登录用户密码
    database='test_db', # 连接的数据库名,也可以后续通过cursor.execture('user test_db')指定
    charset='utf8' # 编码,注意不能写成utf-8
)
cursor = conn.cursor() # 创建一个游标
# 需要执行的创建表的sql语句
sql = """
create table book(
bookid int auto_increment primary key ,
bookname VARCHAR(255) not null ,
authors VARCHAR(255) not null ,
year_publication YEAR not null
);
"""
cursor.execute(sql) # 使用游标执行sql
# 执行完之后别忘了关闭游标和数据库连接
cursor.close()
conn.close()


640.png


在这个创建数据表的例子中,在创建数据库服务连接时,我们通过 database='test_db'这行代码指定参数连接了目标数据库,如果不想在创建数据库服务连接时指定数据库,可以在后续通过cursor.execture('user test_db')这种方法指定数据库。


从上面创建数据库和数据表的例子可以看出,pymysql执行具体操作时都是先创建数据库服务连接,然后通过连接创建游标,以游标来执行具体的sql语句来完成具体的对数据库操作。不单单可以创建数据库、数据表,还可以创建索引、视图等等,方法也是一样的,这里不再介绍。


3 增删改查


3.1 插入


插入操作可以通过游标的execute和executemany两个方法来完成。注意:只要是对数据表有修改的操作(插入、更新、删除)在使用execute方法后,都需要再次调用commit方法对数据库的修改才会最终生效。


execute方法一次插入一条记录,executemany一次插入多条记录:


(1)execute:一次插入一条记录


cursor.execute('insert into book(bookname, authors, year_publication) values("%s", "%s", %s);' % ('Python从入门到放弃', '乔布斯', 2019))conn.commit()


640.png


上面这种写法是先用字符串利用%s占位生成一条完整的sql语句,然后去执行。其实,pymysql的游标也自带这一功能,而且看起来更加方便,所以,我们还可以这样执行execute方法:


cursor.execute('insert into book(bookname, authors, year_publication) values(%s, %s, %s);', ('Python从入门到放弃', '乔布斯', 2019))conn.commit()


640.png


这种方法的好处是sql语句中的%s不需要加引号(如果加了引号,引号也会被当做数据插入到数据表中),游标执行这一语句时,会根据数据类型来判断是否要加上引号。


(2)executemany:一次插入多条记录


data = [
    ('21天完全入门Java', '扎克伯格', 2018),
    ('Linux学习手册', '李纳斯', 2017),
    ('MySQL从删库到跑路', '比尔盖茨', 2018),
]
cursor.executemany('insert into book(bookname, authors, year_publication) values("%s", "%s", %s);', data)
conn.commit()

640.png


3.2 更新


cursor.execute('update book set authors=%s where bookname=%s;', ["马云", "Python从入门到放弃"])
conn.commit()

640.png


3.3 查询


查询是最最要但也是最复杂的一个操作了。我们分为fetch操作、游标两部分来说。


(1)fetch操作


插入、更新、删除操作必须再执行commit操作之后才会生效,而查询操作也只有在执行fetch操作之后才会生效。fetch操作包括3个方法,分别是fetchone()、fetchall()、fetchmany()。


fetchall():查询指定的所有记录
cursor.execute('select * from book where bookid < %s;', [4])
books = cursor.fetchall()
print(books)


输出结果为:


((1, 'Python从入门到放弃', '马云', 2019), (2, 'Python从入门到放弃', '马云', 2019), (3, '21天完全入门Java', '扎克伯格', 2018))


输出结果是以元组的形式来保存,且每一条记录也是一个元素,这是由游标cursor决定的,在下文中还会说到。


fetchmany(size):查询指定数量的记录 cursor.execute('select * from book where bookid < %s;', [4]) books = cursor.fetchmany(2) print(books) 输出结果为:


((1, 'Python从入门到放弃', '马云', 2019), (2, 'Python从入门到放弃', '马云', 2019))


可以看出,fetchmany(size)是取出符合查询条件的最前面的指定数量记录。这里的size指的就是想要取出的记录条数。

fetchone():取出第一条记录


cursor.execute('select * from book where bookid < %s;', [4])
books = cursor.fetchone()
print(books)


输出结果:


(1, 'Python从入门到放弃', '马云', 2019) fetchone()相当于是fetchmany(1),取出第一条符合查询条件的记录。


(2)游标


我们之前使用游标都是采用默认的Cursor类型,除此以外,pymysql还提供了DictCursor、SSCursor、SSDictCursor这几类游标。


DictCursor 之前使用的Cursor返回的数据是以元组的方式保存,而DictCursor是以字典的形式保存。创建这种类型的游标方法也很简单,在conn.sursor()方法中传入DictCursor这个类即可:

cursor = conn.cursor(pymysql.cursors.DictCursor) # 创建一个字典游标
cursor.execute('select * from book where bookid < %s;', [3])
books = cursor.fetchall()
print(books)
cursor.execute('select * from book where bookid < %s;', [3])
book_one = cursor.fetchone()
print(book_one)


输出结果如下:


[{'bookid': 1, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}, {'bookid': 2, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}]
{'bookid': 1, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}


SSCursor和SSDictCursor


SSCursor和SSDictCursor被称为流式游标,这类游标不会像上面使用的Cursor和DictCursor那样,一次性返回所有的数据,流式游标会陆陆续续一条一条得返回查询数据,所以这类游标适用于内存低、网络带宽小、数据量大的应用场景中。


流式游标的使用方法类似于迭代器,再循环中每取一条,生成一条:


cursor = conn.cursor(pymysql.cursors.SSCursor) # 创建一个流式游标
cursor.execute('select * from book;')
book = cursor.fetchone()
while book:
print(book)
book = cursor.fetchone()


输出结果如下:


(1, 'Python从入门到放弃', '马云', 2019) (2, 'Python从入门到放弃', '马云', 2019) (3, '21天完全入门Java', '扎克伯格', 2018) (4, 'Linux学习手册', '李纳斯', 2017) (5, 'MySQL从删库到跑路', '比尔盖茨', 2018)


注意:流式游标虽然也有fetchall()方法,调用后的结果与普通游标一样返回所有数据,但是最好别去调用,这样会失去流式游标的优势。使用流式游标时,如果数据量很大,导致游标一直处在循环遍历状态,这时,数据库连接(conn)是被占用的,不能再被用于执行其他sql,如果要执行其他sql那就必须再创建一个数据库连接,游标占用数据库连接的时长是有限制的,如果流式游标一直在遍历,60秒后数据库连接会断开,不过可以在创建数据库连接时传入参数init_command=("SET NET_WRITE_TIMEOUT=XX")来设置这个超时时间。


SSCursor与SSDictCursor的区别就类似于Cursor和DictCursor的区别,这里就不在介绍了。


3.4 删除


使用pymysql执行插入、更新、删除操作都是相似的,最后都需要commit提交:


cursor.execute('delete from book where bookid=%s;', [1])
conn.commit()


这时候,bookid为1的记录已经被删除,如下图所示:


640.png


也可以使用executemany()一次性删除多条:


cursor.executemany('delete from book where bookid=%s;', [[2], [4]])
conn.commit()


如下图所示,bookid为2和4的记录已经被删除:


640.png

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
索引 Python
Python的列表操作有哪些?
Python的列表操作非常丰富,包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。
25 12
|
2天前
|
数据可视化 数据挖掘 Python
数据界的颜值担当!Python数据分析遇上Matplotlib、Seaborn,可视化美出新高度!
【7月更文挑战第24天】在数据科学领域,Python的Matplotlib与Seaborn将数据可视化升华为艺术,提升报告魅力。Matplotlib作为基石,灵活性强,新手友好;代码示例展示正弦波图的绘制与美化技巧。Seaborn针对统计图表,提供直观且美观的图形,如小提琴图,增强数据表达力。两者结合,创造视觉盛宴,如分析电商平台销售数据时,Matplotlib描绘趋势,Seaborn揭示类别差异,共塑洞察力强的作品,使数据可视化成为触动人心的艺术。
22 7
|
3天前
|
数据可视化 数据挖掘 Python
告别枯燥数字,拥抱视觉盛宴!Python 数据分析中的数据可视化艺术,你 get 了吗?
【7月更文挑战第23天】在数据驱动时代,Python的Matplotlib、Seaborn与Plotly等库使数据可视化成为洞察信息的关键工具。不仅转化数字为图形,更是视觉传达故事。示例代码展示从基础图表到箱线图、小提琴图和热力图的创建过程,强调选择合适图表、简洁设计与色彩的重要性。Python赋能数据可视化,开启数据理解新视角,助于揭示模式、辅助决策。✨📊💡 (总计239字符)
22 7
|
2天前
|
存储 数据可视化 数据挖掘
|
2天前
|
机器学习/深度学习 数据可视化 数据挖掘
从菜鸟到高手,一图胜千言!Python数据分析与机器学习中的数据可视化实战秘籍!
【7月更文挑战第24天】在数据科学中,数据可视化是探索与沟通的关键。从Matplotlib的基础绘图到Seaborn的统计图形,再到Plotly的交互式图表,这些工具助你成为数据叙事大师。示例代码涵盖正弦波图、小费散点图及鸢尾花分布图,展现从简单到复杂的可视化之旅。掌握这些技巧,你就能更有效地解析和呈现数据故事。
|
4天前
|
数据可视化 数据挖掘 数据处理
深度挖掘!Python 数据分析中 Matplotlib 与 Seaborn 的隐藏功能,让数据可视化更出彩!
【7月更文挑战第23天】在Python数据分析中,Matplotlib与Seaborn是关键的可视化工具。Matplotlib提供深度自定义,如调整轴刻度和网格,支持多子图布局。Seaborn基于Matplotlib,简化美观图表生成,内置主题与调色板,适用于复杂统计图形如小提琴图和成对关系图,且无缝集成Pandas数据框。掌握这些库的高级功能,能显著提升数据可视化效果,助力数据分析决策。
15 4
|
5天前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
【7月更文挑战第22天】数据可视化在Python数据科学中至关重要,Matplotlib和Seaborn提供强大工具。案例展示如何用它们分析房屋售价数据:Matplotlib绘制面积与售价散点图揭示正相关,Seaborn的pairplot展示多变量关系。在建模阶段,特征重要性通过条形图可视化,辅助模型优化。这两库是理解数据和提升模型性能的关键。
19 3
|
5天前
|
数据可视化 数据挖掘 Python
逆袭之路!Python数据分析新手如何快速掌握Matplotlib、Seaborn,让数据说话更响亮?
【7月更文挑战第22天】在数据驱动时代,新手掌握Python的Matplotlib与Seaborn可视化技能至关重要。Matplotlib, 基础且灵活, 适合初学者绘制基础图表; Seaborn在其上提供更高级接口, 专注统计图形和美观样式。建议先学Matplotlib掌握核心技能, 再用Seaborn提升图表质量。快速上手Matplotlib需实践, 如绘制折线图。Seaborn特色功能含分布图、关系图、分类数据可视化及高级样式设定。结合两者可实现复杂数据可视化, 先Seaborn后Matplotlib微调。持续实践助你灵活运用工具, 让数据生动呈现, 助力分析与决策。
18 2
|
6天前
|
数据采集 机器学习/深度学习 数据挖掘
从混乱到有序,Python数据清洗术,让你的数据分析之路畅通无阻!
【7月更文挑战第20天】数据清洗在数据分析中至关重要,它确保数据质量,影响分析准确性和效率。Python的Pandas库是数据预处理的得力工具。基本步骤包括:导入数据(如`pd.read_csv()`)、检查概况(`head()`, `info()`, `describe()`)、处理缺失值(`fillna()`或`dropna()`)、转换数据类型(`pd.to_numeric()`)、去除重复项(`drop_duplicates()`)、排序和筛选数据,以及对分类变量编码(如使用`LabelEncoder`)。
30 3
|
7天前
|
数据采集 机器学习/深度学习 数据挖掘
转换数据,扭转乾坤!Python转换技巧,让你的数据分析如虎添翼!
【7月更文挑战第19天】Python在数据转换中扮演关键角色,借助Pandas库进行数据清洗,如填充缺失值、处理异常值和转换数据类型。数据重塑通过pivot、melt和groupby提供多维度视图。文本数据通过独热编码或标签编码转化为数值。自定义函数解决复杂转换问题,提升数据分析的深度和准确性。掌握这些技巧,能有效挖掘数据价值,助力决策。
21 4