升级! 测试萌新Python学习之连通数据库Pymsql增删改及封装(四)

news2024/11/26 2:54:15

pymysql

    • 数据库概述
    • python对数据库的增删改查
    • pymysql核心操作事务
    • 事务操作
    • pymysql工具类封装
    • 每日复习
    • ChatGPT的回答

数据库概述

分类

关系型数据库: 安全

  • 如, mysql oracle SQLite…
  • database tables 行+列

非关系型数据库: 高效

  • 如, redis mongoDB…
  • 数据存储结构多样 键值对, 列表, 字符串…

python操作数据库

第一步导包

python(等各种编程语言)本身不具备直连数据库的功能, 必须导入第三方包

在线安装

  • 命令行运行 pip install pymysql 回车

  • 出现 Successfully installed xxxx 字样, 代表安装成功

  • 校验

    • 命令行运行 pip list 回车
    • 列表中查找到 pymysql 和 版本号 就说明安装成功

第二步连接流程

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="text", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
print("桥", myConn)
print("驴", lv)
# 4.核心操作: 发送sql语句
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

连接成功
在这里插入图片描述

python对数据库的增删改查

    1. 编写sql语句
    1. 执行sql语句 游标对象.execute(要执行的语句)
  • \3. 获取响应结果
    • 获取响应结果行数 游标对象.rowcount
    • 逐行获取数据 游标对象.fetchone()返回一个元组
    • 获取所有数据 游标对象.fetchall(返回一个元组
# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="text", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(查询)
# 4.1 编写sql语句
sql = "SELECT * FROM t_area"
# 4.2 执行sql
lv.execute(sql)
# 4.3 获取响应结果
# 4.3.1 获取相应结果行数
print("响应结果行数:", lv.rowcount)
# 4.3.2 逐行获取数据
# row1 = lv.fetchone()
# row2 = lv.fetchone()
# row3 = lv.fetchone()
# row4 = lv.fetchone()
# row5 = lv.fetchone()
# print("第1行数据:", row1)
# print("第2行数据:", row2)
# print("第3行数据:", row3)
# print("第4行数据:", row4)
# print("第5行数据:", row5)
# 4.3.3 获取所有数据
rows = lv.fetchall()
print("所有数据:", rows)
for row in rows:
    print("每一条:", row)
    print("id", row[0])
    print("区域名称", row[1])
    print("优先级", row[2])
    print("创建时间", row[3])
    print("更新时间", row[4])
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

在这里插入图片描述

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="text", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(增------------------------------)
# 4.1 编写sql语句
sql = "insert into t_area(area_name, priority) values('咚咚咚', '123')"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(改------------------------------)
# 4.1 编写sql语句
sql = "update t_area set area_name='嘻嘻嘻' where area_id=28"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

删除

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(删------------------------------)
# 4.1 编写sql语句
sql = "delete from t_area where area_id=28"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

pymysql核心操作事务

  • 特征(面试常见)

    • 原子性 事务中包含的操作被看作一个逻辑单元, 这个单元中的操作要么都成功, 要么都失败
    • 一致性 逻辑单元中的操作不应该一部分成功一部分失败
    • 孤立性 事务的中间状态对其他事务是不可见的
    • 持久性 指一个事务一旦提交成功, 它对数据库中数据的改变应该是永久性的
  • 事务提交机制

    • 概念
      • 提交: commit, 将修改写入数据库
      • 回滚: rollback, 拒绝将修改写入数据库
    • 方式
      • 手动提交[推荐] 连接对象.commit()
      • 自动提交 创建连接时设置 autocommit=True

    事务操作

    • 需求 向 t_area 表插入信息, 先插入A, 再插入B, 要么都成功, 要么都失败
    • 前提
      • MyISAM 不支持事务(旧版mysql的默认引擎)
      • InnoDB 支持事务(较新版本mysql的默认引擎)
    • 修改数据库引擎
      • 执行 show ENGINES 查看当前 mysql 支持的引擎都有哪些
      • 执行 ALTER TABLE t_area ENGINE=INNODB 修改表 t_area 的引擎为 InnoDB
    • 流程 用 try 语句控制
# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(事务------------------------------)
try:
    sql1 = "insert into t_area(area_name, priority) values('咚咚咚', '111')"
    sql2 = "insert into t_area(area_name, priority) values('嘻嘻嘻', '222')"
    # 执行sql1(插入数据A)
    lv.execute(sql1)
    # 执行sql2(插入数据B)
    lv.execute(sql2)
    # 提交(写入数据库)
    myConn.commit()
except Exception as e:
    print("error:", e)
    # 回滚(拒绝写入数据库)
    myConn.rollback()
# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

pymysql工具类封装

将获取连接, 获取游标, 以及释放资源这些重复性操作, 进行封装, 需要时, 再调用

"""
实现封装:
    将 pymysql 的常见用法实现封装进一个专门工具类
    封装的功能: 1.获取连接 2.获取游标 3.释放资源
"""
import pymysql
class DBUtils:
    # 工具函数 1.获取连接
    @classmethod
    def get_conn(cls):
        return pymysql.Connect(host="127.0.0.1", port=3306, database="text", user="root", password="123456", charset="utf8")
    # 工具函数 2.获取游标
    @classmethod
    def get_cursor(cls, conn):
        return conn.cursor()
    # 工具函数 3.释放资源
    @classmethod
    def close_res(cls, cursor, conn):
        if cursor:
            cursor.close()
        if conn:
            conn.close()
"""
实现调用:
    以查询数据库为例, 调用工具类中封装的功能
"""
# 导包
from pymysql_19 import DBUtils
# 调用获取连接的工具函数
conn = DBUtils.get_conn()
# 调用获取游标的工具函数
lv = DBUtils.get_cursor(conn)
# 核心: 查询为例
sql = "select * from t_area"
lv.execute(sql)
print(lv.fetchall())
# 调用释放资源的工具函数
DBUtils.close_res(lv, conn)

每日复习

  • 能够说出python使用pymysql操作数据库的流程?

  • 使用pymysql做mysql的增删改查操作, 编码步骤有哪些?

  • 实际编写代码完成增删改查的操作?(提交4个脚本)

  • 用举例来说明什么是事务?

  • [面试题]事务有哪些特征?

ChatGPT的回答

好的,让我用一个简单的例子来说明什么是事务。
假设你在银行有两个账户:账户 A 和账户 B。你想要从账户 A 转账 100 美元到账户 B。这个过程涉及两个步骤:

1.从账户 A 中减去 100 美元。
2.将这 100 美元存入账户 B。

在数据库术语中,这两个步骤称为数据库操作。而将它们作为一个整体进行处理的过程就称为事务。
现在,让我们看看事务的属性:

3.原子性(Atomicity):事务应该是原子的,意味着它们应该被视为一个单独的、不可分割的工作单元。在我们的例子中,原子性意味着要么账户 A 减去 100 美元,同时账户 B 增加 100 美元,要么两者都不发生。不会出现只有一个账户发生了变化的情况。
4.一致性(Consistency):事务执行后,数据库应该处于一致的状态。在我们的例子中,这意味着账户 A 和账户 B 的总金额应该保持不变。即使在转账过程中发生了故障,数据库也应该能够通过回滚来保持一致性。
5.隔离性(Isolation):事务的执行应该是隔离的,即一个事务的执行不应该受到其他事务的影响。在我们的例子中,如果同时有另一个转账事务正在进行,它不应该影响我们当前的转账事务。这意味着每个事务应该像在单独的环境中执行一样。
6.持久性(Durability):一旦事务被提交,其结果应该是永久性的,即使系统发生故障。在我们的例子中,一旦转账事务完成并提交,账户 A 和账户 B 的余额变化应该是永久性的,即使系统在此之后发生故障,这两个账户的余额也不应该恢复到转账前的状态。

和账户 B 的总金额应该保持不变。即使在转账过程中发生了故障,数据库也应该能够通过回滚来保持一致性。
5.隔离性(Isolation):事务的执行应该是隔离的,即一个事务的执行不应该受到其他事务的影响。在我们的例子中,如果同时有另一个转账事务正在进行,它不应该影响我们当前的转账事务。这意味着每个事务应该像在单独的环境中执行一样。
6.持久性(Durability):一旦事务被提交,其结果应该是永久性的,即使系统发生故障。在我们的例子中,一旦转账事务完成并提交,账户 A 和账户 B 的余额变化应该是永久性的,即使系统在此之后发生故障,这两个账户的余额也不应该恢复到转账前的状态。

综上所述,事务是数据库管理系统中用来确保数据的完整性和一致性的重要概念。在数据库中执行的每个操作都应该被认为是一个事务,并且应该满足事务的 ACID 属性。

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

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

相关文章

基于springboot+vue+Mysql的音乐翻唱与分享平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波,QRS波群反映左、右心室除极电位和时间的变化,第一个向下的波为Q波,向上的波为R波,接着向下的波是S波。通过GUI进行数据处理,展示心率和QRS。程序已调通,可…

geotrust dv通配符证书800

Geotrust是成立时间较久的正规CA认证机构,在过去的几十年间颁发了无数的SSL证书,这些SSL证书被各个开发者使用,受到大多数浏览器的信任。而Geotrust旗下的DV通配符证书因其广泛的应用范围受到了用户的青睐。今天就随SSL盾小编了解Geotrust旗下…

物联网设计竞赛_3_Jetson Nano连接摄像头

ls /dev/video* 查看是否有摄像头 camorama 开启摄像头 关闭摄像头用&#xff1a; ctr c结束进程 若有camorama被启动用ps aux 或者 ps aux l grep camorama 找到对应进程用 kill -9 <PID>杀死进程再启动 必要的时候也能重启系统再试试&#xff1a; shutdown -r …

Java中PriorityQueue的用途和性能深度剖析

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

出租车计价器设计与实现(论文 + 源码)

关于java出租车计价器设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89304164 出租车计价器设计与实现 摘 要 在我国&#xff0c;出租车行业是八十年代初兴起的一项新兴行业&#xff0c;随着出租车的产生&#xff0c;计价器也就应运而生。但当时在全…

springboot 整合阿里云短信服务

官方sdk示例地址 依赖引入 <!-- https://mvnrepository.com/artifact/com.aliyun/dysmsapi20170525 --><dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.23</version><…

我的 OpenLiteSpeed 从开始到放弃之经历

昨晚下定决心放弃 OpenLiteSpeed 了&#xff0c;从开始到放弃历时七天。总结下来放弃 OpenLiteSpeed 主要是实在不适合明月当前的需要&#xff0c;用起来不是锦上添花而是个累赘了都&#xff0c;今天明月就给大家总结分享一下这次 OpenLiteSpeed 从开始到放弃的经历。 一、Ngin…

福建医疗器械展/2024厦门国际医疗器械展览会重磅来袭

2024中国&#xff08;厦门&#xff09;国际医疗器械展览会 时 间&#xff1a;2024年11月1-3日 November 1-3, 2024 地 点&#xff1a;厦门国际会展中心 Xiamen International Conference & Exhibition Center ​ ◆组织机构 主办单位&#xff1a; 中国技术市场协会医…

【QT】QT环境搭建

本专栏内容为&#xff1a;QT学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握QT。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;QT &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f…

LeetCode 700.二叉搜索树中的搜索

LeetCode 700.二叉搜索树中的搜索 1、题目 题目链接&#xff1a;700. 二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则…

公式识别软件免费的有哪些?简单好用的有三款

公式识别软件免费的有哪些&#xff1f;在数字化时代&#xff0c;公式识别软件已经成为科研、教育等领域不可或缺的工具。这些软件能够准确地将图像中的公式转化为可编辑的文本格式&#xff0c;极大地提高了工作效率。为了帮助大家轻松应对公式识别的挑战&#xff0c;今天本文就…

【数据结构】详解队列

现在我们来掌握一下队列&#xff01;如果有对往期知识有不足地方&#xff0c;可翻阅之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 栈和队列的实现其实都是对你顺序表和链表的检验…

PCIE协议-2-事务层规范-MEM/IO/CFG request rules

2.2.7 内存、I/O和配置请求规则 以下规则适用于所有内存、I/O和配置请求。每种类型的请求还有特定的额外规则。 所有内存、I/O和配置请求除了常见的头标字段外&#xff0c;还包括以下字段&#xff1a;requester ID[15:0]和Tag[9:0]&#xff0c;形成事务ID。Last DW BE[3:0] a…

【面试经典题】环形链表

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 在面试中我们经常会遇到有关链表的相关题目&#xff0c;面试官通常会对题目给出拓展 下面我就两个leetcode上的一个双指针的题目为例&#xff0c;并对其进行拓展 题目链接&#xff1a;环形链表 题目描述&#xf…

pytest(二)

1.pytest-html⽣成报告 Pytest-HTML 是⼀个插件&#xff0c;它可以⽣成漂亮且易于阅读的 HTML 测试报告。下⾯是使⽤ pytest-html ⽣成报告的步骤&#xff1a; 1. 安装 pytest-html 插件&#xff1a; pip install pytest-html 2. 运⾏测试并⽣成报告 pytest --htmlr…

Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…

初探 JUC 并发编程:独占锁 ReentrantLock 底层源码解析

本篇是关于 JUC 并发包中独占锁 ReentrantLock 底层源码的解析&#xff0c;在阅读之前需要对 AQS 抽象队列有基本的了解。 文章目录 1.1 类图结构1.2 获取锁1&#xff09;void lock() 方法2&#xff09;void lockInterruptibly() 方法3&#xff09;boolean tryLock() 方法4&am…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

Git详解之六:Git工具

现在&#xff0c;你已经学习了管理或者维护 Git 仓库&#xff0c;实现代码控制所需的大多数日常命令和工作流程。你已经完成了跟踪和提交文件的基本任务&#xff0c;并且发挥了暂存区和轻量级的特性分支及合并的威力。 接下来你将领略到一些 Git 可以实现的非常强大的功能&…