首页 > 数据库 >Chapter 34 PyMySQL 基本操作指南

Chapter 34 PyMySQL 基本操作指南

时间:2024-08-13 15:54:48浏览次数:12  
标签:Chapter record 数据库 list PyMySQL Record 基本操作 data self

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录


前言

在现代应用开发中,与数据库的高效交互是关键的一环。对于使用 Python 语言的开发者来说,PyMySQL 是一个非常实用的工具,它提供了一个简洁且功能强大的接口,用于连接和操作 MySQL 数据库。本章详细讲解了 PyMySQL 的基本操作步骤。


本篇文章参考:黑马程序员


一、基本操作步骤

PyMySQL 是一个用于 Python 的第三方库,它提供了一个简洁且功能强大的接口用于连接和操作 MySQL 数据库。

基本操作步骤如下:
①安装库
电脑输入Win+R打开运行窗口,在运行窗口输入“cmd”,点击“确定”
在这里插入图片描述
输入pip install pymysql
在这里插入图片描述

② 连接数据库

# 导包
from pymysql import Connection 
# 创建数据库连接  
con=Connection(  
    host='localhost',        # 数据库主机地址
    port=3306,          # 端口,默认3306  
    user='username',         # 数据库用户名  
    password='password',     # 数据库密码  
)

③创建游标

cursor = connection.cursor()

游标是一个数据库对象,用于逐行检索查询结果。在处理大量数据时,游标允许逐行或按块检索数据,从而避免一次性加载所有数据。这种方法有助于减少内存消耗并提高性能。作为数据库交互的核心,游标使开发者能够方便地执行 SQL 操作、从结果集中提取数据、管理事务,并确保资源的合理使用。

  • 与数据库的交互:
    游标提供了与数据库交互的接口,允许我们执行不同类型的 SQL 语句(如查询、插入、更新、删除等)。它像一个指针,指向数据库结果集的当前位置,帮助我们从数据库中获取数据或执行修改。
  • 执行 SQL 语句:
    通过游标的execute()方法,我们可以执行 SELECT 数据查询语句以及INSERT、UPDATE、DELETE 等数据操作语句。
  • 获取查询结果:
    执行完查询后,游标提供了fetchall()方法获取所有结果。该方法返回一个包含所有结果行的列表,每一行是一个元组。
  • 迭代遍历结果集:
    游标返回的结果集可以方便地进行迭代遍历。例如,可以在循环中逐行处理数据。这样可以逐条访问查询结果,而不必一次性加载所有数据,从而节省内存并提高效率。
  • 管理数据库事务:
    事务可确保一系列数据库操作要么全部成功,要么全部失败,保持数据的一致性。游标用于执行这些操作并利用连接对象的commit()rollback()方法管理事务的提交或回滚。

④执行SQL语句
a. 执行查询语句:

# 执行查询性质SQL
cursor.execute("select * from table_name)

# 获取所有结果
result=cursor.fetchall()
#  迭代遍历结果集
for r in result:
    print(r)

b. 执行插入、更新、删除等非查询语句:
pymysql 在执行数据插入或其它产生数据更改的SQL语句时,默认需要通过commit() 确认这种更改行为,否则更改不生效。

# 插入数据  
cursor.execute("INSERT INTO table_name (column1, column2) VALUES (value1, value2)")  

# 提交更改  
connection.commit()

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

# 导包
from pymysql import Connection 
# 创建数据库连接  
con=Connection(  
    host='localhost',        # 数据库主机地址
    port=3306,               # 端口,默认3306  
    user='username',         # 数据库用户名  
    password='password',     # 数据库密码
    autocommit=True          # 设置自动提交
)

⑤关闭游标和连接

cursor.close()      # 关闭游标  
connection.close()  # 关闭连接

二、综合案例分析

【例题1】
假设“sjms”数据库中有一个“student”表,“student”表存储了如下内容:
在这里插入图片描述

# 导入pymysql库中的Connection类,用于建立与MySQL数据库的连接
from pymysql import Connection

# 构建MySQL数据库的连接
con=Connection(
    host="localhost",   # 主机名(IP)
    port=3306,          # 端口,默认3306
    user="root",        # 用户名(输入自己设置的用户名,我设置的账户名是root)
    password="123456"    # 密码(输入自己设置的密码,我设置的密码是123456)
)
# get_server_info()方法将打印出连接的MySQL服务器的版本信息,用于确认连接是否成功以及获取数据库的相关信息
print(con.get_server_info())

cursor=con.cursor()   # 获取游标对象
con.select_db("sjms") # 选择数据库

# 执行查询性质SQL
cursor.execute("select * from student")

# 游标对象使用fetchall()方法,得到的是全部的查询结果,返回的是元组
result=cursor.fetchall()
for r in result:
    print(r)
# 关闭连接
con.close()

输出结果:
在这里插入图片描述

【例题2】
某公司有两份数据文件:“2011年1月销售数据.txt”和“2011年2月销售数据JSON.txt”。前者是普通文本文件,使用逗号分隔数据记录,内容依次为日期、订单编号、销售额和销售省份;后者则是JSON格式的数据,内容依次为日期、订单编号、销售额和销售省份。现在需要对这两份数据进行分析和处理,要求是使用面向对象的编程思想来读取和处理数据,计算每日的销售额,并利用Pyecharts库以柱状图的形式展示结果。
文件部分数据如下:
在这里插入图片描述
要求使用面向对象的编程思想来读取和处理数据,并将数据写入MySQL。

【实现步骤】
在这里插入图片描述

①封装数据对象

"""
数据定义类
Record类用于封装销售数据中每一条记录
"""
class Record:
    # 该构造方法接受日期、订单编号、销售额和省份,并将它们存储为类的实例变量
    def __init__(self,date,order_id,money,province):
        self.date = date            # 订单日期
        self.order_id = order_id    # 订单编号
        self.money = money          # 订单金额
        self.province = province    # 销售省份
    # 字符串表示法,方便打印Record对象的内容,返回一个格式化的字符串
    def __str__(self):
        return f"{self.date},{self.order_id},{self.money},{self.province}"

【分析】
Record 类的主要作用是将销售数据的每一条记录封装为一个对象,提供了一个清晰的结构来存储和访问这些数据。通过该类,可以方便地创建多个销售记录对象,并在需要时以易读的格式输出它们。在整个分析过程中,Record 类将被用于读取和存储来自两个数据文件的销售记录。

②读取数据

"""
文件相关的类定义
"""

# 导入 json 模块,用于处理JSON文件
import json
# 导入 Record 类,以便在其他类中创建记录对象
from data_define import Record

# 定义一个抽象类,用于顶层设计,定义了文件读取的接口
class FileReader:
    # 抽象方法,强制子类实现相应的读取方法,并返回一个包含Record对象的列表
    def read_data(self)->list[Record]:
        pass

# 子类TextFileReader继承父类FileReader,用于从文本文件中读取数据
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_list来存储Record对象
        record_list:list[Record]=[]
        # 循环读取每一行数据
        for line in f.readlines():
            line=line.strip()   # 消除读取到的每一行数据中的 \n
            data_list=line.split(",")
            # print(data_list)
            # 输出内容:['2011-01-01', '4b34218c-9f37-4e66-b33e-327ecd5fb897', '1689', '湖南省']……
            record=Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            # print(record)
            # 输出内容:2011-01-01,4b34218c-9f37-4e66-b33e-327ecd5fb897,1689,湖南省
            record_list.append(record)

        f.close()
        return record_list


# 子类JsonFileReader继承自父类FileReader,用于从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():
            # 将json数据转换为Python字典
            data_dict=json.loads(line)
            # 从字典中提取相应的字段
            record=Record(data_dict["date"],data_dict["order_id"],data_dict["money"],data_dict["province"])
            print(record)
            record_list.append(record)

        f.close()
        return record_list

【分析】
这段代码实现了一个简单的文本文件读取器,用于读取不同格式的文件(文本和 JSON),并将文件中的每一行数据转换为 Python 对象,便于在后续程序中管理和操作这些数据。

③构建数据库链接
a. 新建一个数据库,数据库名称为“py_sql”
b. 基于数据结构建表,建表语句如下:

CREATE TABLE orders(
    order_date DATE,
    order id VARCHAR(255),
    money INT,
    province VARCHAR(10)
);

c. 编写详细代码

# 导入必要的库和之前定义的类
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pymysql import Connection

# 创建TextFileReader和JsonFileReader的实例,读取数据到列表中
text_file_reader=TextFileReader("D:/2011年1月销售数据.txt")
jan_data:list[Record]=text_file_reader.read_data()

json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
feb_data:list[Record]=json_file_reader.read_data()

# 将两个月份的数据合并为一个list来存储
all_data:list[Record]=jan_data+feb_data

# 构建MySQL数据库的连接
con=Connection(
    host="localhost",   # 主机名(IP)
    port=3306,          # 端口,默认3306
    user="root",        # 用户名(输入自己设置的用户名,我设置的账户名是root)
    password="18414",   # 密码(输入自己设置的密码,我设置的密码是123456)
    autocommit=True     # 设置自动提交
)
# 获取游标对象
cursor=con.cursor()
# 选择数据库
con.select_db("py_sql")
# 组织SQL语句
for record in all_data:
    sql=(f"insert into orders(order_date,order_id,money,province) "
         f"values('{record.date}','{record.order_id}','{record.money},'{record.province}')")
    # print(sql)
    # 输出结果:insert into orders(order_date,order_id,money,province) values('2011-01-01','4b34218c-9f37-4e66-b33e-327ecd5fb897','1689,'湖南省')……

    # 执行sql语句
    cursor.execute(sql)
# 关闭连接
con.close()

【分析】
这段代码读取了两个不同格式的销售数据文件(一个文本文件和一个JSON文件),合并了数据并将其插入到 py_sql 数据库的 orders 表中。

运行结果:
在这里插入图片描述

标签:Chapter,record,数据库,list,PyMySQL,Record,基本操作,data,self
From: https://blog.csdn.net/2302_80253507/article/details/141111396

相关文章

  • chapter11------进入保护模式
    全局描述符表(GDT)这里要先说明下,保护模式下对内存段的访问是有限制的,简单来说就是你不能再随意的访问了,只能访问授权给你的,然后段的访问限制等等信息就记载在一个叫做全局描述表里段描述符段描述符存储了某个段的具体信息,就像我们每个人的档案一样,记录着我们的信息然后段描述......
  • sky-take-out chapter 2
    01新增员工(1)需求分析和设计分析产品原型接口设计本项目约定:管理端发出的请求,统一使用/admin作为前缀用户端发出的请求,统一使用/user作为前缀数据库设计employee表(2)代码开发根据新增员工接口设计对应的DTOController中新增员工,接收前端的DTO,调用Service方......
  • Chapter 32 MySQL入门
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、SQL语言二、数据库三、MySQL的安装四、图形化工具DBeaver前言随着数据量的急剧增长,数据库管理系统在现代软件开发中扮演着至关重要的角色。MySQL作为一种流行的开源数据库,以其高......
  • chapter10------32位x86处理器编程架构
    处理器架构处理器架构或者处理器编程架构,是指一整套的硬件架构以及与之相适应的工作状态回顾8086处理器8086处理器有20根地址线,可以寻址1MB内存,但处理器内部的寄存器只有16位,也就是数据线是16根,只能处理16位的数据我们没法用16位的寄存器去访问1MB的内存,简单来说就是无法用16......
  • PythonL-Chapter_01_基础语法
    注释#这是单行注释"""这是多行注释可以写多行文字"""变量和数据类型内置基本数据类型整数(int):用于表示没有小数部分的数字,例如-1,0,1,100等浮点数(float):用于表示带有小数部分的数字,例如3.14,2.718字符串(str):用于表示文本信息,必须使用引号(单引......
  • Chapter 31 面向对象数据分析案例
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!本篇文章参考:黑马程序员【面向对象数据分析案例】某公司有两份数据文件:“2011年1月销售数据.txt”和“2011年2月销售数据JSON.txt”。前者是普通文本文件,使用逗号分隔数据记录,内容依次为日期、订单编......
  • chapter9------中断
    中断是什么中断就是打断处理器当前的执行流程,去执行另外一些和当前工作不相干的指令,执行完之后,还可以返回到原来的程序流程继续执行为什么会有中断机制中断这种机制能够让处理器可以在不同任务之间快速切换,实现多任务处理的功能。试想一下没有中断机制,一次只能执行一个任务,那我......
  • Chapter 30 多态
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、基本概念二、抽象类前言多态(Polymorphism)是面向对象编程中的核心概念,本章将详细讲解Python中多态的实现方式以及如何应用多态提高代码的可维护性。本篇文章参考:黑马程序员......
  • sky-take-out chapter 1
    开发环境搭建一、前端环境搭建二、后端环境搭建2.1项目结构(1)sky-take-out:maven父工程,统一管理依赖版本,聚合其他掌控子模块(2)sky-common:子模块,存放公共类,例如:工具类、常量类、异常类等constant常量类context与项目上下文有关enumeration枚举类exception异常类......
  • Java数据结构 | 二叉树基础及基本操作
    二叉树一、树型结构1.1树的概念1.2关于树的一些常用概念(很重要!!!)1.3树的表示形式1.4树的应用二、二叉树2.1二叉树的概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1代码说明2.5.2二叉树的遍历2.5.3二叉树的基本操作1、获取树......