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

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

                                                     —— 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.hqwc.cn/news/617408.html

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

相关文章

赋能Web3用户:增强在线隐私

随着数字化时代的发展,人们越来越依赖互联网来进行各种活动,从社交互动到金融交易,几乎所有的日常生活都离不开网络。然而,随之而来的是个人隐私安全面临的挑战。在传统的互联网架构下,用户的个人数据往往被中心化的平…

OpenCV4.10使用形态运算提取水平线和垂直线

目标 在本教程中,您将学习如何: 应用两个非常常见的形态运算符(即膨胀和侵蚀),并创建自定义内核,以便在水平轴和垂直轴上提取直线。为此,您将使用以下 OpenCV 函数: erode()dilate…

C 408—《数据结构》易错考点200题(含解析)

目录 Δ前言 一、绪论 1.1 数据结构的基本概念 : 1.2 算法和算法评价 : 二、线性表 2.2 线性表的顺序表示 : 2.3 线性表的链式表示 : 三、栈、队列和数组 3.1 栈 3.2 队列 3.3 栈和队列的应用 3.4 数组和特殊矩阵 四、串 4.2 串的模式匹配 五、树与二叉树 5.1 树的基…

mars3d.MaterialType.Image2修改配置面状:图片2的speed数值实现动画效果说明

摘要: mars3d.MaterialType.Image2修改配置面状:图片2的speed数值实现动画效果说明 前提: 1.在示例中,尝试给mars3d.MaterialType.Image2材质的图片加上speed参数,实现动画效果,但是没有看到流动效果说明…

CCS在线调试时实时修改变量值

在使用CCS调试dsp芯片时,发现CCS软件有一个非常好的功能,在仿真调试的时候可以实时修改代码中变量的值。这个功能在调试switch语句的时候非常好用,比如想要执行哪个case语句,直接在仿真界面里面修改switch语句入口参数就行。   …

全球历年GDP增长率_探数API数据统计

以下是数据的详细说明: 全球GDP增长最快的年份是1964年,全球GDP增速达到6.65%。2021年的GDP增长率也相当高,主要受2020年衰退后的恢复性增长推动。 全球GDP增长最慢的年份包括:1974年、1975年(第一次石油危机引发&…

【亲测】国内如何支付Overleaf?Overleaf如何升级标准版专业版?Overleaf升级保姆级教程

0. 【必看】开通步骤简述 升级Overleaf的步骤简要总结如下: 使用虚拟信用卡平台WildCard开通虚拟信用卡(从链接进入可以优惠15元人民币哦)。开卡后,进入WIldcard找到卡片信息进入Overleaf绑定卡片并支付,完成支付后就…

【arduino】控制N位数码管

以下以四位共阳极数码管为例; 本文所有说明均以注释的方式进行。 使用方法: #include "DigitalTube.h" //每位共阳极对应的引脚int digital[4] {8, 11, 12, 7};//参数分别为a f b g e c d dp digital(共阳极引脚数组) length(digital长度)D…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

数字人生成 Wav2Lip面部动画 神经辐射场 NeRF场景结构 3DMM人脸模型 深度学习 生成对抗网 GAN 语音交互、虚拟现实(VR)和增强现实(AR)

数字人生成 喝奶茶的甄嬛 数字人,从广义上来说,是数字技术在人体解剖、物理、生理及智能各个层次、各个阶段的渗透。它是信息科学与生命科学融合的产物,利用信息科学的方法对人体在不同水平的形态和功能进行虚拟仿真。数字人可以是虚拟人物,也可以是真实人物的数字再现,它…

Typora导入功能使用详细

一、 pandoc安装(导入需要的插件) 1. 首次安装完typora,是没法导入的,需要安装pandoc,首先我们先在文件夹里面新建一个Typora文件,然后再找到导入功能点击就可以弹出安装的地址了 2. 点击文件可以找到导入…

常用算法——双指针算法

双指针算法介绍: 所谓的双指针算法看似十分的神秘,但是实质上就是两个标志查找元素的变量。双指针既可以是我们平常最常说的指针(类似int *类型的数据),也可以是数组的下标。因为对于一个数组数据的查找,通…