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

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.获取连接@classmethoddef get_conn(cls):return pymysql.Connect(host="127.0.0.1", port=3306, database="text", user="root", password="123456", charset="utf8")# 工具函数 2.获取游标@classmethoddef get_cursor(cls, conn):return conn.cursor()# 工具函数 3.释放资源@classmethoddef 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.hqwc.cn/news/696898.html

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

相关文章

本来还挺喜欢……

前阵子买了个天空星开发板,到手之后发觉不对劲。 之前我们玩玩开发板都是用的面包板的,就算是ESP那种比较宽的板子用两个面包板拼一下也勉强可以用。 但是天空星它的引脚是分为两组,每组有两排,如果我们还是直接使用面包板的话&a…

【MYSQL】一颗B+树可以保存多少条数据

引言 事万物都有自己的单元体系,若干个小单体组成一个个大的个体。就像拼乐高一样,可以自由组合。所以说,如果能熟悉最小单元,就意味着我们抓住了事物的本事,再复杂的问题也会迎刃而解。 存储单元 存储器范围比较大…

Hystrix服务熔断

服务熔断 熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时, 会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微 服务调用响应正常后恢复调用链路。 在Spri…

软件需求工程习题

1.(面谈)是需求获取活动中发生的需求工程师和用户间面对面的会见。 2.使用原型法进行需求获取,(演化式)原型必须具有健壮性,代码质量要从一开始就能达到最终系统的要求 3.利用面谈进行需求获取时&#xf…

自动故障转移

这里询问,你的插槽是从哪里移动过来的? all:代表全部,也就是三个节点各转移一部分具体的id:目标节点的iddone:没有了 这里我们要从7001获取,因此填写7001的id: 填完后,…

一文入门DNS

概述 DNS是一个缩写,可以代表Domain Name System,域名系统,是互联网的一项基础服务。也可以代表Domain Name Server,域名服务器,是进行域名和与之相对应的IP地址相互转换的服务器。DNS协议则是用来将域名转换为IP地址…

半监督的GCN:Semi-Supervised Classification With Graph Convolutional Networks

Semi-Supervised Classification With Graph Convolutional Networks -Theophilus Siameh-2017(2023) 思路 使用可扩展方法对图进行半监督学习,其中CNN应用在图数据上,得到GCN。 这种方法是在图的边的数量上进行线性的缩放模型,并学习包含局部图结构和图节点的几个隐藏层…

Ubuntu22.04怎么安装cuda11.3

环境: WSL2 Ubuntu22.04 问题描述: Ubuntu22.04怎么安装cuda11.3 之前是11.5 解决方案: 在Ubuntu 22.04上安装CUDA 11.3需要一些步骤,因为CUDA 11.3不是为Ubuntu 22.04官方支持的版本。但是,您仍然可以通过以下步…

【玄机平台】应急响应

前言: 感谢玄机平台靶机的提供,让我学到了不少东西 平台题解 : 第一章 应急响应-webshell查杀 1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx} ssh连接 下载/var/www/html源码(finsehll连直接下)压缩丢…

[Kubernetes] sealos 部署 K8s v1.25.0 集群

文章目录 1.sealos 介绍2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.sealos 介绍 Sealos 是一个基于 Kubernetes 内核的云操作系统发行版。它采用云原生方式,摒弃传统的云计算架构,转向以 Kubernetes 为云内核的新架构。这使得企…

Kubernetes——两万字超细致集群搭建平台规划

目录 前言——常见的K8S安装部署方式 一、Kubernetes平台规划 1.单Master集群架构 2.多Master集群架构 二、集群规划 1.服务器硬件配置推荐 2.操作系统初始化 2.1关闭防火墙 2.2关闭SElinux 2.3关闭Swap 2.4添加Hosts 2.5调整内核参数 2.5同步时间 三、集群搭建…

栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

一.有效的括号 ​​​OJ链接 这一道题我们就可以用栈来解决: 不了解栈的可以看我的上一篇博客。 typedef char STDataType; //用数组来实现栈 typedef struct stack {STDataType* a;int capacity;int top; }ST; void STInit(ST* pst) {assert(pst);pst->a NU…