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,    # 端口,默认3306
    user = '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,                 # 端口,默认3306
    user = '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,                 # 端口,默认3306
    user = '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,                 # 端口,默认3306
    user = '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,                 # 端口,默认3306
    user = '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    # 订单ID
        self.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]:
        # 方法内部使用成员变量用self
        f = open(self.path, "r", encoding="UTF-8")
        # 类型注解
        record_list: list[Record] = []
        for line in f.readlines():
            # 消除读取到的每一行数据中的\n
            line = 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 = path

    def 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_list


if __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 json

from pymysql import Connection

f = 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()

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Kubernetes[K8S]集群:Slaver从节点初始化和Join]:添加到主节点集群内

文章目录 操作流程:上篇主节初始化地址:前置:Docker和K8S安装版本匹配查看0.1:安装指定docker版本 **[1 — 8] ** [ 这些步骤主从节点前置操作一样的 ]一:主节点操作 查看主机域名->编辑域名->域名配置二&#x…

一台电脑上安装多个软件不同版本

工作中经常需要用到不同版本的jdk、nodejs等 以nodejs为例,使用哪个版本将哪个版本挪到上方:

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明:https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示汉字应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD12864显示汉字应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD12864简单介绍一、LCD12864点阵型液…

Python分支结构

我们刚开始写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。 然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家在一分钟内跑完全程,那么在完成本局游戏后&#x…

【日常记录】【JS】一道解构面试题

文章目录 1、描述2、分析与实现3、参考链接 1、描述 让这一段代码可以执行,并且正确输出 let [name, age] {name: 呆呆狗,age: 20}console.log(name, age);2、分析与实现 在浏览器上执行这段代码会报错 翻译以下:不是可迭代对象 可迭代对象(…

【计算机毕业设计】基于Java+SSM的实战开发项目150套(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 🧡今天给大家分享150的Java毕业设计,基于ssm框架,这些项目都经过精心挑选,涵盖了不同的实战主题和用例,可做毕业设计和课程…

965: 循环队列

解法&#xff1a;顺序表实现 #include<iostream> #include<vector> using namespace std; struct SeqList {int* data;int front;int rear;int len; }; void initList(SeqList* list,int size) {list->data new int[size];list->len size;list->front …

sudo apt install ros-humble-gazebo-*显示网络不可达 Ubuntu20.04使用清华镜像本地安装/更新ros2

问题 sudo apt install ros-humble-gazebo-*显示网络不可达&#xff0c;这是因为sources.list中的镜像源有问题&#xff0c;换成清华源可以解决问题 解决 1 设置Ubuntu镜像源为清华镜像源 1.1 备份source.list文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.ba…

实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展

自2023年华为宣布全新HarmonyOS NEXT蓄势待发&#xff0c;鸿蒙原生应用全面启动以来&#xff0c;已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中&#xff0c;美团作为国内头部的科技零售企业&#xff0c;是首批加入鸿蒙生态的伙伴&#xff0c;其下的…

【vue】toRef,toRefs

toRef&#xff1a;把一个 响应式对象 转换为对应的ref变量toRefs&#xff1a;把一个 响应式对象 转换为对应的ref对象 代码 <template><P>mname: {{ mname }} </P><P>mage: {{ mage }} </P><P>msex: {{ msex }} </P><P>mhobb…

fastjson 序列化问题

问题: 使用fastjson 的 对同一个JSONObject对象 多次引用后, 通过 JSON.toJSONString() 方法进行json序列化时出现只有第一次的可以成功序列化未json string 字符串, 后面的对象都为引用地址; 示例: public static void main(String[] args) {JSONObject jsonObject new JSON…

2024最新信息系统项目管理师--(1抵100)真题考过的十大管理点(细致)

备注&#xff1a; 1.这里将汇总所有管理的输入、输出、使用的工具 2.对真题考过的点&#xff0c;将会标红处理&#xff0c;并进行细致说明 3. 针对最新的改版点&#xff0c;用绿色标记 信息系统项目管理师第4版&#xff08;5大过程、10大管理&#xff09; 十大管理启动过程组…

CVPR‘24| Leap-of-Thought! 中大/哈佛等提出CLoT探究大模型幽默创新响应

Leap-of-Thought! 中大/哈佛等提出CLoT探究大模型幽默创新响应 什么是“大喜利”创新响应游戏&#xff1f;为什么考虑“大喜利”游戏&#xff1f;性能结果展示激发创造力的思维方式Leap-of-Thought (LoT)通向LoT! 激发创造力的训练方法CLoT性能评估总结 (导读) 多模态大模型具备…

【Java系列】SpringCloudAlibaba统一返回体及全局异常捕获实现

本文将以实际代码展示如何实现SpringCloudAlibaba的统一返回体及全局异常捕获。 作者&#xff1a;后端小肥肠 1. 前言 在构建微服务应用时&#xff0c;统一返回体和异常捕获机制的设计对于保持代码的整洁性和提高服务的可维护性至关重要。特别是在使用 Spring Boot 和 Spring …

数据结构初阶:二叉树(一)

树概念及结构 树的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个特殊的结点&a…

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

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

HarmonyOS鸿蒙端云一体化开发--适合小白体制

端云一体化 什么是“端”&#xff0c;什么是“云”&#xff1f; 答&#xff1a;“端“&#xff1a;手机APP端 “云”:后端服务端 什么是端云一体化&#xff1f; 端云一体化开发支持开发者在 DevEco Studio 内使用一种语言同时完成 HarmonyOS 应用的端侧与云侧开发。 …

AI预测体彩排3第3弹【2024年4月14日预测--第1套算法开始计算第3次测试】

今天咱们继续测试第1套算法和模型&#xff0c;今天是第3次测试&#xff0c;目前的测试只是为了记录和验证&#xff0c;不建议大家盲目跟买。我的目标仍旧是10次命中3-4次!~废话不多说了&#xff0c;直接上结果&#xff01; 2024年4月14日排3的七码预测结果如下 第一套&…

LLM 推理优化探微 (4) :模型性能瓶颈分类及优化策略

编者按&#xff1a; 在人工智能浪潮袭卷全球的大背景下&#xff0c;进一步提升人工智能模型性能&#xff0c;满足更多应用需求已经刻不容缓。如何优化模型延迟和吞吐量&#xff0c;成为了业界亟待解决的重要问题。 我们今天为大家带来的这篇文章&#xff0c;其观点为&#xff1…