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.mzph.cn/news/815142.shtml

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

相关文章

GPT4.5发布了?OpenAI终于发布正式版Turbo,重回AI王座第一

令人惊讶的是,短短三个月内,全球最强AI的称号又一次易主了!几个月前,Claude3 Opus的性能全面超过了GPT-4,全球网友纷纷转向Claude3,并分享了他们对Claude3的惊艳体验。然而,OpenAI最近再次展示了…

探索GlusterFS:开源分布式文件系统

目录 引言 一、GlusterFS简介 (一)基本介绍 (二)GlusterFS特点 (三)GlusterFS术语 (四)GlusterFS工作流程 二、GlusterFs的卷类型 (一)卷类型 &…

【免安装的MATLAB--MATLAB online】

目录: 前言账号的注册图片处理的示例准备图片脚本函数 总结 前言 在计算机、数学等相关专业中,或多或少都会与MATLAB产生藕断丝连的联系,如果你需要使用MATLAB,但是又不想要安装到自己的电脑上(它实在是太大了啊&#…

Linux 系统问题排查常用命令

立刻关机 haltcentos安装yum apt-get install yum查找文件夹 find / - name 需要查找文件名称vi里面 查找字符串 “/”,后面跟要查找的字符串,再按回车。vi将光标定位在该串下一次出现的地方上。键入n跳到该串的下一个出现处,键入N跳到该…

正则表达式 速成

正则表达式的作用 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字…

c语言中<string.h>的strstr与strtok函数

c语言中string.h的strstr与strtok函数 代码运行结果 代码 #include <stdio.h> #include <string.h>///1.在字符串str1里面,查找第一次出现str2的位置 //char * strstr(const char * str1,const char * str2)///2.sep为分割符,根据分割符来对str进行分割 //char * …

解决Django中的UnicodeDecodeError问题

在使用Django进行Web开发时&#xff0c;有时会遇到一些由于编码不一致引起的问题&#xff0c;特别是在处理文件读写操作时。一个常见的错误是UnicodeDecodeError&#xff0c;其表现为gbk codec cant decode byte 0xa6 in position 9737: illegal multibyte sequence。这个问题通…

【设计模式学习】单例模式和工厂模式

꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转…

【SpringBoot:详解Bean装配】

&#x1f3e1;Java码农探花&#xff1a; &#x1f525; 推荐专栏&#xff1a;<springboot学习> &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、IoC容器的简介BeanFactory接口源码二、Bean装配扫描装配探索启动类条件装配自定义Bean总…

版本管理|Git -目前最好的版本管理工具

文章目录 什么是版本为什么需要版本管理Git -目前最好的版本管理工具Git的关键特点和概念初始化Git保存代码改变git addgit commit -m ""git statusgit log branch分支管理git branch & git chekoutHEAD的本质git merge 合并fast forward merge 本地与远程如何解…

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接&#xff1a;240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程&#xff0c;谁排除…

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址&#xff1a; 论文地址点击即可跳转 官方代码地址&#xff1a; GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候&#xff0c;都会丢失一定的信息。针对这一问题&#xff1a; 论文中提出的可编程梯度信息…

免费的 ChatGPT 网站(六个)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、insCode二、讯飞星火三、豆包四、文心一言五、通义千问六、360智脑 现在智能…

【漏洞复现】WordPress LayerSlider插件SQL注入漏洞复现

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

C数据结构:双向链表(带头循环)

前言 链表分多种&#xff0c;分别为 不带头不循环单向链表、不带头循环单向链表、带头循环单向链表、带头不循环单向链表 不带头不循环双向链表、不带头循环双向链表、带头循环双向链表、带头不循环双向链表 一共八种 在前一篇博客中完成的单链表即为不带头不循环单向链表…

杰发科技AC7840——CAN通信简介(5)_可变波特率设置

0. 简介 设置可变波特率时候&#xff0c;遇到2个坑&#xff0c;在此记录下来 使用该函数即可 can_time_segment_t bitrate2 s_canBitrate[CAN_BITRATE_250K]; CAN_DRV_SetBitrate(instance, &bitrate2); 1. 波特率指针注意不要空 查看设置波特率的接口&#xff0c;发现…

吉他弹唱谱怎么制作 Guitar Pro 怎么写弹简谱 Guitar Pro8.02简谱

学习如何制作吉他弹唱谱是提升音乐创作和表现能力的重要一环。借助专业的软件工具如Guitar Pro&#xff0c;可以轻松地将音乐创意转化为可视化的乐谱&#xff0c;使演奏和分享变得更加便捷和高效。下面我们来看看吉他弹唱谱怎么制作&#xff0c;Guitar Pro 怎么写弹简谱的相关内…

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

机器学习和深度学习--李宏毅(笔记与个人理解)Day9

Day9 Logistic Regression&#xff08;内涵&#xff0c;熵和交叉熵的详解&#xff09; 中间打了一天的gta5&#xff0c;图书馆闭馆正好npy 不舒服那天天气不好&#xff0c;哈哈哈哈哈总之各种理由吧&#xff0c;导致昨天没弄起来&#xff0c;今天补更&#xff01; 这里重点注意…

面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...

写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题&#xff0c;正好我们最近也在梳理学习AQS&#xff08;抽象队列同步器&#xff09;&#xff0c;而CountDownLatch又是其中典型的代表&#xff0c;我们今天就继续来学一下这个同步工具类&#xff01; CountDownLatc…