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.rhkb.cn/news/308569.html

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

相关文章

什么是面向对象思想?

面向对象不是一种技术,而是一种思想。它指导我们以什么形式组织代码,以什么思路解决问题。 面向对象编程,是一种通过对象方式,把现实世界映射到计算机世界的编程方法。 面向对象解决问题的思路:把构成问题的事物分解成…

Go——网络编程

一. 互联网协议介绍 网络基础——网络传输基本流程_网络传输过程-CSDN博客 应用层HTTP协议-CSDN博客 传输层UDP/TCP协议_udp报文提供的确认号用于接收方跟发送方确认-CSDN博客 网络层IP协议-CSDN博客 链路层以太网详解_以太网数据链路层-CSDN博客 二. Socket编程 Socket是…

中国省级人口结构数据集(2002-2022年)

01、数据简介 人口结构数据不仅反映了地域特色,更是预测地区未来发展趋势的重要工具。在这些数据中,总抚养比、少年儿童抚养比和老年人口抚养比是三大核心指标。 少儿抚养比0-14周岁人口数/15-64周岁人口数 老年抚养比65周岁及以上人口数/15-64周岁人…

SpringBoot编写一个SpringTask定时任务的方法

1,在启动类上添加注解 EnableScheduling//开启定时任务调度 2, 任务(方法)上也要添加注解: Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域: 秒 分 时 日 月 周 (年&#…

03-JAVA设计模式-外观模式

外观模式 什么是外观模式 外观模式(Facade Pattern)是面向对象设计模式中的一种,它为子系统中的一组接口提供了一个统一的高级接口,使得子系统更容易使用。外观模式定义了一个高层接口,让子系统更容易使用。子系统中…

【JS进阶】第四天

JavaScript 进阶 - 第 4 天 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型,因为简单类型直接拷贝值了 浅拷贝:拷贝的是地址,只拷贝一层 常见方法: 拷贝对象:Object.assgin() / 展开运算符 {…obj} 拷贝对象…

Linux_ubuntu使用常见问题解决

文章目录 1.安装好了搜狗输入法却只能输出英文: 1.安装好了搜狗输入法却只能输出英文: 1.浏览器搜索搜狗输入法,下载好安装包 终端输入下列命令安装,找不到文件可以cd到该安装包的目录文件下: sudo dpkg -i sogoupin…

自定义vue-cli 实现预设模板项目

模板结构 主要包括四个部分: preset.jsonprompts.jsgenerator/index.jstemplate/ 项目最终结构 preset.json preset.json 中是一个包含创建新项目所需预定义选项和插件的 JSON 对象,让用户无需在命令提示中选择它们,简称预设;…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

云计算重要概念之:虚拟机、网卡、交换机、路由器、防火墙

一、虚拟机 (Virtual Machine, VM) 1.主流的虚拟化软件: 虚拟化软件通过在单个物理硬件上创建和管理多个虚拟环境(虚拟机),实现资源的高效利用、灵活部署、隔离安全以及便捷管理,是构建云计算和现代化数据中心的核心…

B端:弹窗的场景、类型、 选择策略串讲,让你的设计有理有据。

B端产品在什么情况下使用弹窗,弹窗又分为哪些类型,该如何选择合理的弹窗形式,很多小伙伴都是跟着感觉走,本文告诉你依据。 一、弹窗及其场景 在B端系统中,"B端"通常指的是面向企业(Business&am…

VMware Workstation部署最新版OpenWrt 23.05.3

正文共:1456 字 51 图,预估阅读时间:2 分钟 我们之前介绍了如何在VMware Workstation上安装OpenWrt(软路由是啥?OpenWrt又是啥?长啥样?在VMware装一个瞅瞅),也介绍了如何…

十分钟学懂Java并发

并发简介 我们学到的基本上都是有关顺序编程的知识,即程序中所有事物在任意时刻都只能执行一个步骤。 编程问题中相当大的一部分都可以通过使用顺序编程来解决。然而,对于某些问题,如果能够并发地执行程序中的多个部分,则会变得非…

lua学习笔记19(面相对象学习的一点总结)

print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…

1688商品详情接口技术深探:解锁电商数据新纪元,实现业务自动化飞跃

1688商品详情接口技术解析 一、引言 随着电子商务的快速发展,越来越多的企业开始关注如何利用API接口获取商品详情信息,以实现数据的自动化处理和业务的快速拓展。1688作为国内知名的B2B电商平台,其商品详情接口成为了众多企业关注的焦点。…

三小时使用鸿蒙OS模仿羊了个羊,附源码

学习鸿蒙arkTS语言,决定直接通过实践的方式上手,而不是一点点进行观看视频再来实现。 结合羊了个羊的开发思路,准备好相应的卡片素材后进行开发。遇到了需要arkTS进行解决的问题,再去查看相应的文档。 首先需要准备卡片对应的图片…

什么是JAVA面向对象

一,什么是面向对象: 我们以前的项目都是面向过程的,一个完整的项目所有的代码都写在一个类里 这就叫面向过程。 面向对象,是指在写大型项目时,多人分工合作,为了代码看上去简洁美观,会将不同的…

2023-2024年科技行业主要变化趋势梳理与总结

一、主要大额并购案例并购原因 (一)产品线补充与业务市场拓展(如VMware、Activision Blizzard并购案) (二)技术整合(如Spunk并购案)、 (三)优化运营以期溢…

MFC:手写一个模态对话框程序

我们知道,在MFC中,要生成一个模态对话框程序,只要按着VS的提示,拖拖拽拽就能生成一个这样的程序,效率非常高。这里,我们反其道而行之,自己写一个这样的程序,这个程序与自动生成的程序…

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

Day 18 Spatial Transformer Layer 因为单纯的cNN无法做到scaling(放大)and rotation(转),所以我们引入; 实战中也许我们可以做到 是因为 我们的training data 中包含了对data 的augmentation; …