Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

news/2024/5/22 9:10:09

少年有梦,不应至于心动,更要付诸行动

                                                     —— 24.4.12

pymysql

除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库

在Python中,使用第三方库:pymysql来完成对MySQl数据库的操作

安装

pip install pymysql

创建到MySQL的数据库链接

from pymysql import Connection# 获取到MySQL数据库的链接对象
conn = Connection(host = 'localhost', # 主机名(IP地址)port = 3306,    # 端口,默认3306user = 'root',   # 账户名password = 'xxxxxxx'    # 密码
)# 打印MySQL数据库软件信息
print(conn.get_server_info())# 关闭到数据库的链接
conn.close()

pymysql库的基本操作

非查询性质SQL

'''
演示Python pymysql库的基本操作
'''
from pymysql import Connection# 获取到MySQL数据库的链接对象
conn = Connection(host = 'localhost',          # 主机名(IP地址)port = 3306,                 # 端口,默认3306user = 'root',               # 账户名password = '954926928lcl'    # 密码
)# 执行非查询性质SQL# 获取游标对象
cursor = conn.cursor()# 选择数据库
conn.select_db("test")# 使用游标对象,执行sql语句
cursor.execute("create table pythonTest(id int);")    # 分号可省略

查询性质SQL

'''
演示Python pymysql库的基本操作
'''
from pymysql import Connection# 获取到MySQL数据库的链接对象
conn = Connection(host = 'localhost',          # 主机名(IP地址)port = 3306,                 # 端口,默认3306user = 'root',               # 账户名password = '954926928lcl'    # 密码
)# 执行非查询性质SQL# 获取游标对象
cursor = conn.cursor()# 选择数据库
conn.select_db("twe_8")# 使用游标对象,执行sql语句# 执行查询性质SQl# 获取查询结果
cursor.execute("select * from dept")# 拿到查询结果
results = cursor.fetchall()# 打印出查询结果
for r in results:print(r)# 打印MySQL数据库软件信息
# print(conn.get_server_info())# 关闭到数据库的链接
conn.close()

如何获取链接对象

        ①from pymysql import Connection 导包

        ②Connection(主机,端口,账户,密码)即可得到链接对象

        ③链接对象.close() 关闭和MySQL数据库的链接

如何执行SQL查询

        通过链接对象调用cursor()方法,得到游标对象

                游标对象.execute()执行SQL语句

                游标对象.fetchall()得到全部的查询结果封装入元组内

数据插入

commit提交

经过python执行的数据插入操作是无法将数据插入到数据表中

        ***因为pymysql是在执行数据插入或其他产生数据更改的SQL语句时,默认需要提交更改的,即:需要通过代码”确认“这种更改行为

        通过 链接对象.commit() 即可确认此行为,只有确认的修改,才能生效

'''
演示使用pymysql库进行数据插入的操作
'''# 导包
from pymysql import Connection# 构建MySQL数据库的链接
conn = Connection(host = 'localhost',          # 主机名(IP地址)port = 3306,                 # 端口,默认3306user = 'root',               # 账户名password = 'xxxxx'    # 密码
)# 执行非查询性质SQL
cursor = conn.cursor()  # 获取到游标对象
# 选择数据库
conn.select_db("ele_29")
# 执行sql
cursor.execute("insert into dept values(45,'小明')")
# 通过commit确认
conn.commit()
# 关闭链接
conn.close()

自动commit

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

autocommit = True

# 构建到MySQL数据库的链接
conn = Connection(host = "localhost",    # 主机名(IP)port = 3306,           # 端口user = "root",         # 账户password = "xxxxxx",   # 密码autocommit = True      # 设置自动提交
)

如上代码进行设置,即可自动提交无需手动commit了

示例:

'''
演示使用pymysql库进行 数据插入 的操作
'''# 导包
from pymysql import Connection# 构建MySQL数据库的链接
conn = Connection(host = 'localhost',          # 主机名(IP地址)port = 3306,                 # 端口,默认3306user = 'root',               # 账户名password = '954926928lcl',   # 密码autocommit = True            # 设置自动提交(确认)
)# 执行非查询性质SQL
cursor = conn.cursor()  # 获取到游标对象
# 选择数据库
conn.select_db("ele_29")
# 执行sql
cursor.execute("insert into dept values(1001,'林俊接')")
# # 通过commit确认
# conn.commit()
# 关闭链接
conn.close()

运行结果

综合案例

使用SQL语句和pymysql库完成综合案例的开发

        我们使用前文中的销售数据集,完成使用Python语言,读取数据,并将数据写入MySQL的功能

1.DDL定义

本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql

基于数据结构,我们可以得到建表语句

create table orders(order_date DATE,order_in varchar(255)money int,province varchar(10)
)

① 创建数据库

② 使用py_sql数据库

use py_sql;

③ 建表语句

create table orders(order_date date,	order_id varchar(255),money int,province varchar(10)
);

④ 数据定义的类

'''
数据定义的类1. 设计一个类,可以完成数据的封装'''class Record:# 使用构造方法定义成员变量 方便在构造类对象的时候直接赋值def __init__(self,data,order_id,money,province):self.data = data            # 订单日期self.order_id = order_id    # 订单IDself.money = money          # 订单金额self.province = province    # 销售省份# 定义一个魔术方法
# 定义一个成员方法,不然直接返回会返回一个内存地址def __str__(self):return f"{self.data},{self.order_id},{self.money},{self.province}"

⑤ 文件相关的类

'''
和文件相关的类定义在这里2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
'''import json# 导包
from data_define import Record# 定义一个抽象类用来做顶层设计,确定类中有哪些功能需要实现
class FileReader:# 顶层设计 pass变为抽象方法def read_data(self) -> list[Record]:    # 返回值是一个Record类的列表List# 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可pass# 文本数据的文件读取器,继承抽象类
class TextFileReader(FileReader):# 定义一个构造方法def __init__(self, path):self.path = path  # 定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:# 方法内部使用成员变量用selff = open(self.path, "r", encoding="UTF-8")# 类型注解record_list: list[Record] = []for line in f.readlines():# 消除读取到的每一行数据中的\nline = line.strip()# 以逗号用split方法进行切割data_list = line.split(",")# 金钱数字进行转换int()record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])record_list.append(record)# 关闭文件对象f.close()# 返回record对象列表return record_list# JSON文件读取器2
# 同样继承于FileReader
class JsonFileReader(FileReader):def __init__(self, path):# 定义成员变量记录文件的路径self.path = pathdef read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():data_dict = json.loads(line)record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])# 将record对象放入record_list中,并返回record_list.append(record)# 关闭文件对象f.close()return record_listif __name__ == '__main__':text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")list1 = text_file_reader.read_data()list2 = json_file_reader.read_data()for l in list1:# 魔术方法print(l)for l in list2:print(l)

⑥ 综合案例main代码

# 导包
from file_define import FileReader, TextFileReader, JsonFileReader
from data_define import Record
from pymysql import  Connection# 读取数据,将读取到的数据保存在变量中
text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")# 一月份数据
jan_data: list[Record] = text_file_reader.read_data()   # 类型注解
# 二月份数据
feb_data: list[Record] = json_file_reader.read_data()   # 类型注解# 将两个月份的数据合并为1个list来存储,通过加法存储
all_data: list[Record] = jan_data + feb_data            # 类型注解# 构建MySQL链接对象
conn = Connection(host = "localhost",port = 3306,user = "root",password ="954926928lcl",autocommit = True
)# 获得游标对象
cursor = conn.cursor()# 选择数据库
conn.select_db("py_sql")# 组织SQL语句
for record in all_data:sql = f"insert into orders(order_date,order_id,money,province)" \f"values('{record.data}', '{record.order_id}', '{record.money}', '{record.province}')"# 通过游标对象传递SQL语句传给游标对象 执行SQL语句cursor.execute(sql)# 关闭MySQL链接对象
conn.close()

 结果

⑦ 课后作业

     将我们写入到MySQL的数据,通过Python代码读取出来,再反向写出如图的文件

代码


# 导包
import jsonfrom pymysql import Connectionf = open("D:PythonSqlExa.txt", "w", encoding="UTF-8")# 构建MySQL链接对象
conn = Connection(host="localhost",port=3306,user="root",password="954926928lcl",autocommit=True
)# 获得游标对象
cursor = conn.cursor()
# 选择数据库
conn.select_db("py_sql")
# 选择表
cursor.execute("select * from orders")
# 存储数据
data_tuple = cursor.fetchall()f = open("E:\python.learning\pythonSql.txt", "w", encoding="UTF-8")data_dict = {}
for record in data_tuple:data_dict["data"] = str(record[0])data_dict["order_id"] = record[1]data_dict["money"] = int(record[2])data_dict["province"] = record[3]f.write(json.dumps(data_dict, ensure_ascii=False))f.write("\n")f.close()conn.close()

运行结果


http://www.mrgr.cn/p/88031083

相关文章

解析HMI面板实例

拆解一个已有的画面面板实例来看看画面面板是怎么实现的。使用实例,需要从项目库里面拖出来。拖出来之后画面如图,它是一个组合画面。这个画面有四个属性,以及一个事件。需要传入的数据类型FnCselInHMI属性需要传入一个bool类型数据 H_lAnim需要传入一个DWORD类型数据 Type和…

滚雪球学Java(74):深入理解JavaSE输入输出流:掌握数据流动的奥秘

咦咦咦,各位小可爱,我是你们的好伙伴 bug菌,今天又来给大家手把手教学Java SE系列知识点啦,赶紧出来哇,别躲起来啊,听我讲干货记得点点赞,赞多了我就更有动力讲得更欢哦!所以呀&…

c语言,单链表的实现----------有全代码!!!!

1.单链表的定义和结构 单链表是一种链式的数据结构,它用一组不连续的储存单元存反线性表中的数据元素。链表中的数据是以节点的形式来表示的,节点和节点之间相互连接 一般来说节点有两部分组成 1.数据域 :数据域用来存储各种类型的数据&…

这些Git事故灾难, 你经历过几个?

在大规模的协作中, git pull和push是远远不够使用的. 笔者介绍了自己在一线的工作中遇到了各种事故现场, 以及相应的解决方案. 快进来学习下, 也许以后用得上.前言 关于Git, 相信大家最常用的就是pull和push. 但随着协作规模的提升, 遇到的问题也会越来越多. 本篇文章并不科普一…

Ranorex无法使用spy识别element(只能识别外部container) --针对edge浏览器

1.问题 问题如标题,这是一个很严重的问题,表明我们不仅不能通过track识别元素,更重要的是spy无法识别UI元素,就会导致我们无法通过自动化脚本来控制UI元素,实现自动化测试!!! 2.解决 2.1 确保不要同时开启两个Chrome用例(chorme或者edge) 2.2 可以开启 Internet Explorer 模式(…

秋叶Stable diffusion的创世工具安装-带安装包链接

来自B站up秋葉aaaki,近期发布了Stable Diffusion整合包v4.7版本,一键在本地部署Stable Diffusion!! 适用于零基础想要使用AI绘画的小伙伴~本整合包支持SDXL,预装多种必须模型。无需安装git、python、cuda等任何内容&am…

SAP在中国的合作伙伴有哪些?

SAP作为一家全球领先的企业管理解决方案供应商,深受全球各行各业各规模企业的信赖。SAP拥有超过40年的专业经验,被称为ERP系统的“最后一道防线”。无论是面向中小型企业的Business one,还是面向中、大型集团的S/4HANA,不同规模、行业的企业都能从SAP的多样化企业管理解决方…

ubuntu安装python3.10

1. 官网下载源程序 2. 解压进入文件夹: ./configure --prefix/usr/local/python3/ 3. 编译安装: make && make install 4. 添加环境变量: vim ~/.bashrc PATH/usr/local/python3/bin:$PATH #保存后,刷新配置文件 sour…

EQ-BDS面板部署机器人

一、机器人配置教程 0.预处理 首先处理杀毒软件误报问题。在服务器上安装火绒安全当然,您也可以不选择火绒,使用其他杀毒软件,到时候给插件加上信任即可安装完成后禁用Windows Defender,详见EQ-BDS面板用户手册 1.下载然后解压压缩包 点我跳转到下载页面 这个网盘不需要开会…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索AI大模型与函数式编程模式融合之旅✨ 在编程世界的广阔疆域里,两大…

基于ChatGPT打造安全脚本工具流程

基于ChatGPT打造安全脚本工具流程前言 以前想要打造一款自己的工具,想法挺好实际上是难以实现,第一不懂代码的构造,只有一些工具脚本构造思路,第二总是像重复造轮子这种繁琐枯燥工作,抄抄改改搞不清楚逻辑,想打造一款符合自己工作的自定义的脚本工具难度倍增,但是随着AI…

-sh: ./example: No such file or directory

接上文的问题,咨询了隔壁部门的技术大佬后,认为是使用的交叉编译工具太旧了。因此在ARM官网重新下载工具包:下载到虚拟机后配置,完成后运行source命令使配置生效: source /etc/profile 重新编译目标代码并下载到开发板后运行:看到编译输出,已经能够找到文件了,只是缺少…

lua基本语法

Lua语法入门 初识lua vi hello.lua print("hello,lua") lua hello.lua 变量和循环 变量 循环 条件控制、函数 条件控制

RocketMQ 之 IoT 消息解析:物联网需要什么样的消息技术?

作者:林清山(隆基) 前言: 从初代开源消息队列崛起,到 PC 互联网、移动互联网爆发式发展,再到如今 IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头。 目前&a…

Mybatis-plus中的分页操作

Mybatis-plus中的分页操作 1.导入Mybatis-plus依赖2.创建mybatis配置类3.参数 1.导入Mybatis-plus依赖 因为是一个springboot项目&#xff0c;其中的pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns&q…

个人项目作品集

前言 个人博客地址: Lovi* - 博客园 (cnblogs.com) 后端代码地址:Lovi (shenqing0202) - Gitee.com 前端代码地址:Lovi-github (Lovi) Java相关项目 Servlet+jsp【热忱冰棒电子相册】 后端架构数据库表项目图片SSM+jsp【比赛抽签分组系统】 代码架构项目图片Springboot+vue…

Mac(M1)配置基于ARM64的Tensorflow

以下步骤最好先执行 conda config --remove-key channels 删除conda镜像源 pip config unset global.index-url 删除pip镜像源 然后接下来的步骤最好挂上梯子。 1.下载miniforge:从https://github.com/conda-forge/miniforge上找到arm64(Apple Silicon)版本进行下载,下一步…

2024 CVPR AIGC集合

完全外行&#xff0c;不建议参考 一、3D重建 PointAvatar: Deformable Point-based Head Avatars from Videos 对原始颜色进行解纠缠&#xff0c;得到固有反射和相关阴影。 基于可变形点云对表情、颜色、位置等信息进行建模。 总结&#xff1a;可以看作是对局部像素的分解与扩…

YOLOv8 测试 5:Linux 中 Docker 部署 YOLOv8,Python 封装 API 接口,base64 图片处理

一、前言 记录时间 [2024-4-14] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;二&#xff09;&#xff1a;在 Linux 中部署 Docker&#xff08;Centos7 下安装 docker、环境配置&#xff0c;以及镜像简单使用&#xff09; API 接口简单使用&#xff08;二&#xff09;…