Python与MySQL

一、Python 操作 MySQL 数据库软件

我们在上一篇文章《SQL入门》中使用了图形化工具DBeaver操作MySQL数据库软件,除了使用图形化工具以外,我们也可以使用编程语言来执行 SQL 从而操作数据库,可以在 Python 中,使用第三方库 pymysql 来完成对 MySQL 数据库的操作。

1.1第三方库 pymysql 的安装

使用快捷键Win+R打开运行窗口,然后输入"cmd"并按下回车键,调出CMD命令窗口,在命令窗口中输入“ pip install pymysql ”,按下回车键,等待安装成功即可,如下图所示,代表安装成功。

1.2创建到 MySQL 的数据库链接

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的,密码因人而异
)
#打印MySQL数据库软件信息
print(con.get_server_info())
#关闭到数据库的链接
con.close()

如果能正常输出,就说明链接成功,输出的信息是MySQL 的版本,如下图所示:

1.3执行非查询性质SQL查询

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的
)
#打印MySQL数据库软件信息
print(con.get_server_info())
#获取游标对象
cursor=con.cursor()
con.select_db('test')  #选择数据库
#使用游标对象,执行SQL语句,创建名为test_pymysql的表,表中有2列
cursor.execute('CREATE TABLE test_pymysql (id INT,info VARCHAR(255))') #代码中的SQL语句末尾不用加分号
#关闭到数据库的链接
con.close()

运行代码后,打开DBeaver,发现表test_pymysql已经被创建,两个列名也已经生成。

1.4执行查询性质SQL查询

为了便于演示,我们直接使用上一篇文章《SQL入门》中创建的表info,表info也在数据库test中。

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的
)#获取游标对象
cursor=con.cursor()
con.select_db('test')  #选择数据库
#使用游标对象,执行SQL语句,查询名为info的表中的全部内容
cursor.execute('SELECT * FROM info')
#获取查询结果
result:tuple=cursor.fetchall() #游标对象使用 fetchall() 方法,得到的是全部的查询结果,是一个元组,所以用元组来接收
for i in result:  #result这个元组的元素类型也是元组,即每一行查询结果是一个元组print(i)
#关闭到数据库的链接
con.close()

运行代码后得到输出:

(1, '张三', '男', 26)
(2, '李四', '女', 16)
(3, '王五', '男', 56)
(4, '小明', '男', 6)
(5, 'coco', '女', 36)

输出结果与表info中的内容一致。

1.5插入数据到 MySQL

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的
)cursor=con.cursor()    #获取游标对象
con.select_db('test')  # 选择数据库
cursor.execute("INSERT INTO info VALUES(06,'Mary','女',24)")#使用游标对象,执行SQL语句,插入数据
#关闭到数据库的链接
con.close()

运行代码后我们刷新(或者重新打开)表info,发现数据并没有成功插入。

这是因为pymysql 在执行数据插入或其它产生数据更改的 SQL 语句时,默认是需要提交更改的,即需要通过代码“确认”这种更改行为,在代码中通过链接对象 .commit() 即可确认此行为。

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的
)cursor=con.cursor()    #获取游标对象
con.select_db('test')  # 选择数据库
cursor.execute("INSERT INTO info VALUES(06,'Mary','女',24)")#使用游标对象,执行SQL语句,插入数据
con.commit()  #通过commit确认
#关闭到数据库的链接
con.close()

运行代码后我们刷新(或者重新打开)表info,发现数据成功插入。

如果不想手动 commit 确认,我们也可以在构建链接对象的时候,设置自动 commit 的属性。

from pymysql import Connection
#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的autocommit=True       #设置自动提交
)cursor=con.cursor()    #获取游标对象
con.select_db('test')  # 选择数据库
cursor.execute("INSERT INTO info VALUES(07,'庄庄树','男',8)")#使用游标对象,执行SQL语句,插入数据
#关闭到数据库的链接
con.close()

运行代码后我们刷新(或者重新打开)表info,发现数据成功插入。

注意:pymysql 库在执行对数据库有修改操作的行为时,是需要通过链接对象的 commit成员方法来进行确认的,可以手动 commit 确认,也可以在构建链接对象的时设置自动 commit 的属性,只有确认的修改,才能生效。

二、案例—使用 Python 语言,读取数据,并将数据写入 MySQL

2.1案例需求

我们使用 Python 语言,读取文件“2011年1月销售数据”和文件“2011年2月销售数据JSON”中的数据,并将数据写入 MySQL 。

(文件链接: https://pan.baidu.com/s/1FWQhkToiJT_xZfYGfIWyvQ?pwd=a2hi 提取码: a2hi )

文件数据格式如图所示:

2.2处理过程

将文件“2011年1月销售数据”和文件“2011年2月销售数据JSON”处理一下,步骤详见《综合案例—面向对象+数据可视化》中2.2读取数据,(链接:综合案例—面向对象+数据可视化-CSDN博客)

将文件中的数据处理成数组类型后,我们先在数据库test中建立2张表,分别用来存放1月和2月数据,然后往表中插入数据,代码如下:

from File_define import TextFileReader, JSONFileReader
from Record_define import Record
from pymysql import Connection#读取并处理数据
text_file_reader=TextFileReader('E:/可视化案例数据/2011年1月销售数据.txt')
json_file_reader=JSONFileReader("E:/可视化案例数据/2011年2月销售数据JSON.txt")
jan_data:list[Record]=text_file_reader.read_data()
feb_data:list[Record]=json_file_reader.read_data()#获取到MySQL数据库的链接对象
con=Connection(host='localhost',     #主机名(或IP地址)port=3306,            #端口,默认3306user='root',          #账户名password='123456'     #密码,在MySQL安装过程中自己设置的autocommit=True       #设置自动提交
)
#获取游标对象
cursor=con.cursor()
con.select_db('test')  #选择数据库
#使用游标对象,执行SQL语句,创建名为January_sales_data和February_sales_data的2张表,表结构相同,其中有4列
cursor.execute('CREATE TABLE January_sales_data (order_date DATE,order_id VARCHAR(255),money INT,province VARCHAR(20))')
cursor.execute('CREATE TABLE February_sales_data (order_date DATE,order_id VARCHAR(255),money INT,province VARCHAR(20))')
#往表中插入数据
for record in jan_data:sql=f"INSERT INTO January_sales_data VALUES('{record.date}','{record.order_id}',{record.money},'{record.province}')" #除了money是int类型,其他都要用单引号括起来cursor.execute(sql)  # 使用游标对象,执行SQL语句,插入数据
for record in feb_data:sql=f"INSERT INTO February_sales_data VALUES('{record.date}','{record.order_id}',{record.money},'{record.province}')" #除了money是int类型,其他都要用单引号括起来cursor.execute(sql)  # 使用游标对象,执行SQL语句,插入数据
#关闭到数据库的链接
con.close()

运行代码后打开DBeaver,2张表已经被创建,且按照预期一样存有数据。

其中模块“Record_define.py”的内容如下:

class Record:def __init__(self,date,order_id,money,province):  #运用__init__构造方法,便于给类对象赋值self.date=date          #订单日期self.order_id=order_id  #订单IDself.money=money        #订单金融self.province=province  #销售省份def __str__(self):   #运用__str__构造方法,便于控制类对象转换为字符串return f'{self.date},{self.order_id},{self.money},{self.province}'

其中模块“File_define.py”的内容如下:

import json
from Record_define import Record# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:def read_data(self)->list[Record]:#读取文件的数据,将读到的每一条数据都转换为Record对象,将它们都封装到list内返回pass#处理普通文本类型
class TextFileReader(FileReader):def __init__(self,path):self.path=path     #定义成员变量记录文件的路径#复写(实现抽象方法)父类的方法def read_data(self) ->list[Record]:#打开文件f=open(self.path,'r',encoding='UTF-8')#创建类型为Record类对象的列表以存储数据record_list:list[Record]=[]for line in f.readlines():line= line.strip()  # 消除读取到的每一行数据中的\nlist=line.split(',')record=Record(list[0],list[1],int(list[2]),list[3]) #必须将类Record中第三个成员变量强制转换为int类型,否则后面无法正常累加销售额record_list.append(record)f.close()return record_list#处理json类型
class JSONFileReader(FileReader):def __init__(self,path):self.path=path     #定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) ->list[Record]:f=open(self.path,'r',encoding='UTF-8')record_list:list[Record]=[]for line in f.readlines():dict_line=json.loads(line)record=Record(dict_line['date'],dict_line['order_id'],int(dict_line['money']),dict_line['province'])#必须将类Record中第三个成员变量强制转换为int类型,否则后面无法正常累加销售额record_list.append(record)f.close()return record_list

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

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

相关文章

设计师的新宠:7款不容错过的界面设计软件

在UI设计领域,设计师们常常需要借助各种工具来实现他们的创意。市场上众多的设计软件让设计师们有了丰富的选择,但同时也带来了选择困难。一个好的软件界面设计工具不仅能提升工作效率,还能为设计师提供丰富的资源和参考,帮助他们…

Python:背景知识及环境安装

一、计算机的基础概念 1.1 什么是计算机? 最早我们有计算器,但是他只能完成算数运算的功能 而计算机能完成的工作有: (1)算术运算 (2)逻辑判断 (3)数据存储 &#xff08…

使用AutoDL训练YOLO等计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

前言 本文记录利用AutoDL云服务器,使用VS Code远程连接进行模型训练,步骤完整,操作简便,不需要使用任何命令即可快速运行🚀。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Bac…

分享几个办公类常用的AI工具

办公类 WPS AI讯飞智文iSlideProcessOn亿图脑图ChatPPT WPS AI 金山办公推出的协同办公 AI 应用,具有文本生成、多轮对话、润色改写等多种功能,可以辅助用户进行文档编辑、表格处理、演示文稿制作等办公操作。 https://ai.wps.cn/ 讯飞智文 科大讯飞推…

博弈论 C++

前置知识 若一个游戏满足: 由两名玩家交替行动在游戏进行的任意时刻,可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏(NIM)属于公平组合游戏,但常见的棋类游戏&…

企业数字化转型建设方案(数据中台、业务中台、AI中台)

方案介绍: 企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施,负责数据的整合、治理、共享和应用,将数据转化为资产,服务于业务决策和运营。业务中台是连接数据中台和技术中台的桥梁,负责业务的抽象…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

DSPy:不需要手写prompt啦,You Only Code Once!

论文地址:https://arxiv.org/abs/2310.03714   项目地址:https://github.com/stanfordnlp/dspy 文章目录 1. 背景2. 签名3. 模块3.1 预测模块3.2 其他内置模块 4. 提词器5. 评估目标6. 代码分析6.1 _prepare_student_and_teacher6.2 _prepare_predicto…

985研一,转嵌入式好还是后端开发好?

有个老铁问,985研一,转嵌入式好还是后端开发好? 我认为,这学历,两个随便挑,我说的,从趋势来看,更建议嵌入式,走供应链上游,芯片原厂、新能源车企、军工或者搞…

力扣143:重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示…

qt creator 转 visual stdio 项目调试

因果 大家在使用qt creator调试程序时,会出现未知错误,比如下图,直接release运行就没有问题。由于调试复杂程序,使用qt creator都感觉不如vs,会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…

【电子元件】光通量和色温 (欧司朗LED灯珠 KW3 CGLNM1.TG命名规则)

什么是光通量? 光通量(Luminous Flux)是衡量光源在单位时间内发出的可见光总量的物理量,表示的是光源产生的总光能量,其中只考虑人眼能感知的部分。它通常以流明(lumen,符号为 lm)为…

如何使用gitlab切换分支

第一步,在gitlab上新建一个远程分支。选择New branch即可新建一个,但是注意往往是在当前分支下新建的分支,所以新分支里会有当前分支的内容。 第二步,在本地当前分支在运行这三行命令,即可得到一个空的新分支。 git c…

springboot2.0x 和springboot 1.0 整合redis 使用自定义CacheManager 问题

问题描述: 在我们深入理解springboot2.0x的缓存机制的时候,发现在springboot1.0 和springboot2.0 中默认的序列化都是使用的jdk的 Serializer 实现这个接口,jdk自带的序列化方法,由此我们需要自己去创建自定义的RedisCacheManager…

《Python游戏编程入门》注-第2章2

《Python游戏编程入门》的“2.2.5 绘制线条”中提到了通过pygame库绘制线条的方法。 1 相关函数介绍 通过pygame.draw模块中的line()函数来绘制线条,该函数的格式如下所示。 line(surface, color, start_pos, end_pos, width1) -> Rect 其中,第一…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM(Basic Software Mode Manager)模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式(如启动、运行、停车等),并根据不同的…

基于vue框架的的电子商务网站68pwt(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,商品分类,商品信息 开题报告内容 基于Vue框架的电子商务网站开题报告 一、研究背景与意义 随着互联网技术的不断发展和普及,电子商务已成为现代商业活动的重要组成部分。电子商务网站作为线上交易的主要平台&#xf…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生,学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…

混个1024勋章

一眨眼毕业工作已经一年了,偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候,本来以为自己这一年没学到多少东西,但是看看自己的博客其实也有在进步,虽然比不上博客里的众多大佬,但是回头看也算是自己的…