接口测试(五)—— PyMySQL增删改查、数据库工具类封装

news2024/10/7 16:26:27

目录

数据库操作应用场景

一、PyMySQL操作数据库

1、安装PyMySQL

2、PyMySQL操作步骤

3、事务的概念

4、PyMySQL连接数据库

4.1 建立连接方法

4.2 入门案例

5、PyMySQL操作数据库

5.1 SQL 语法

5.2 数据库查询

5.3 案例(查询)

5.4 数据库UID(增、删、改) 

5.5 案例(增、删、改) 

二、数据库工具类封装

1、封装的目的

2、设计数据库工具类

3、实现类方法

3.1 获取、关闭连接

3.2 查询一条记录

3.3 增删改数据

3.4 完整封装代码实现


数据库操作应用场景

  • 校验 测试数据
    • 接口发送请求后明确会对数据库中的某个字段进行修改,但,响应结果中无该字段数据时
      • 如:ihrm 删除员工接口。 is_delete 字段,没有 在响应结果中出现! 需要 借助数据库 校验!
  • 构造 测试数据
    • 测试数据使用一次就失效
      • 如:ihrm 添加员工接口,使用的手机号!
    • 测试前,无法保证测试数据是否存在
      • 如:ihrm 查询员工接口,使用的 员工id

一、PyMySQL操作数据库

1、安装PyMySQL

  •  方法1:
pip install PyMySQL
  • 方法2:
pip install PyMySQL -i https://pypi.douban.com/simple/

2、PyMySQL操作步骤

1. 导包 import pymysql
2. 创建连接。 conn = pymysql.connect(host,port, user, password, database, charset)
3. 获取游标。 cursor = conn.cursor()
4. 执行 SQL。 cursor.execute( ”sql语句“ )
        查询语句(select)
                处理结果集(提取数据 fetch*)
        增删改语句(insert、update、delete)
                成功:提交事务 conn.commit()
                失败:回滚事务 conn.rollback()
5. 关闭游标。cursor.close()
6. 关闭连接。conn.close()

3、事务的概念

  • 事务,是关系型数据库(mysql)特有的概念。
  • 事务,可以看做一个虚拟的 容器,在容器中存放一系列的数据库操作,看做一个整体。内部的所有操作,要么都一次性全部成功,只要有一个失败,就全部失败!

  • 事务操作:只有 2 种情况
    • 提交:conn.commit()
    • 回滚: conn.rollback()

4、PyMySQL连接数据库

4.1 建立连接方法

conn = pymysql.connect(host="", port=0,user="", 
                    password="", database="", charset="")

host:数据库所在主机 IP地址 - string
port:数据库使用的 端口号 - int
user:连接数据库使用的 用户名 - string
password:连接数据库使用的 密码 - string
database:要连接的那个数据库的名字 - string
charset:字符集。常用 utf8 - string


conn:连接数据库的对象。

4.2 入门案例

查询数据库,获取MySQL服务器 版本信息

# 1. 导包
import pymysql

# 2. 建立连接
conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
        password="iHRM_student_2021", database="test_db", charset="utf8")

# 3. 获取游标
cursor = conn.cursor()

# 4. 执行 sql 语句(查询)
cursor.execute("select version()")

# 5. 获取结果
res = cursor.fetchone()
print("res =", res[0])

# 6. 关闭游标
cursor.close()

# 7. 关闭连接
conn.close()

5、PyMySQL操作数据库

5.1 SQL 语法

参考:软件测试 —— 数据库(MySQL、SQL语句、Navicat) 

5.2 数据库查询

常用方法

  • fetchone():从结果集中,提取一行。
  • fetchmany(size):从结果集中,提取 size 行。
  • fetchall():提取所有结果集。
  • 属性rownumber:可以设置游标位置。

5.3 案例(查询)

查询t_book表,获取 第一条 数据
查询t_book表,获取 前两条 数据
查询t_book表,获取 全部 数据
查询t_book表,获取 第3条和第4条 数据

# 1. 导包
import pymysql
# 2. 建立连接
conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
        password="iHRM_student_2021", database="test_db", charset="utf8")
# 3. 获取游标
cursor = conn.cursor() # 指向 0 号位置。
# 4. 执行 sql 语句(查询)--- t_book
cursor.execute("select * from t_book;")
# 5. 获取结果 - 提取第一条
res1 = cursor.fetchone()
print("res1 =", res1)
# 修改游标位置:回零
cursor.rownumber = 0
# 5. 获取结果 - 提取前 2 条
res2 = cursor.fetchmany(2)
print("res2 =", res2)
# 修改游标位置:回零
cursor.rownumber = 0
res3 = cursor.fetchall()
print("res3 =", res3)
# 修改游标位置:指向第 2 条记录
cursor.rownumber = 2
res4 = cursor.fetchmany(2)
print("res4 =", res4)
# 6. 关闭游标
cursor.close()
# 7. 关闭连接
conn.close()

异常捕获

# 1. 导包
import pymysql
# 定义全局变量,初值为 None
conn = None
cursor = None
try:
    # 2. 建立连接
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
    password="iHRM_student_2021", database="test_db", charset="utf8")
    # 3. 获取游标
    cursor = conn.cursor() # 指向 0 号位置。
    # 4. 执行 sql 语句(查询)--- t_book
    cursor.execute("select * from t_book;")
    # 5. 获取结果 - 提取第一条
    res1 = cursor.fetchone()
    print("res1 =", res1)
    # 修改游标位置:回零
    cursor.rownumber = 0
    # 5. 获取结果 - 提取前 2 条
    res2 = cursor.fetchmany(2)
    print("res2 =", res2)
    # 修改游标位置:回零
    cursor.rownumber = 0
    res3 = cursor.fetchall()
    print("res3 =", res3)
    # 修改游标位置:指向第 2 条记录
    cursor.rownumber = 2
    res4 = cursor.fetchmany(2)
    print("res4 =", res4)
except Exception as err:
    print("查询语句执行出错:", str(err))
finally:
    # 6. 关闭游标
    cursor.close()
    # 7. 关闭连接
    conn.close()

5.4 数据库UID(增、删、改) 

更新操作流程

5.5 案例(增、删、改) 

单独实现如下操作:

        ①:新增一条图书数据(id:5 title:西游记 pub_date:1986-01-01 )

        ②:把图书名称为‘西游记’的阅读量加一

        ③:删除名称为‘西游记’的图书

插入数据:

"""
新增一条图书数据(id:5 title:西游记 pub_date:1986-01-01 )
insert into t_book(id, title, pub_date) values(5, '西游记', '1986-01-01');
1. 导包
2. 创建连接
3. 获取游标
4. 执行 insert 语句
5. 提交/回滚事务
6. 关闭游标
7. 关闭连接
"""
# 1. 导包
import pymysql
# 定义全局变量
conn = None
cursor = None
try:
    # 2. 创建连接
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                            password="iHRM_student_2021",
                            database="test_db", charset="utf8")
    # 3. 获取游标
    cursor = conn.cursor()
    # 4. 执行 insert 语句
    cursor.execute("insert into t_book(id, title, pub_date) values(175, '西游记', '1986-            01-01');")
    # 查看 sql执行,影响多少行
    print("影响的行数:", conn.affected_rows())
    # 5. 提交事务
    conn.commit()
except Exception as err:
    print("插入数据错误:", str(err))
    # 回滚事务
    conn.rollback()
finally:
    # 6. 关闭游标
    cursor.close()
    # 7. 关闭连接
    conn.close()

修改数据:

"""
把图书名称为‘西游记’的阅读量加一
update t_book set `read` = `read` + 1 where id = 6;
1. 导包
2. 建立连接
3. 获取游标
4. 执行 update语句
5. 提交、回滚事务
6. 关闭游标
7. 关闭连接
"""
# 1. 导包
import pymysql
conn = None
cursor = None
try:
    # 2. 建立连接
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                            password="iHRM_student_2021",
                            database="test_db", charset="utf8")
    # 3. 获取游标
    cursor = conn.cursor()
    # 4. 执行 update语句。字段名,需要使用 反引号(`)包裹
    cursor.execute("update t_book set `read` = `read` + 1 where id = 1023;")
    print("影响的行数:", conn.affected_rows())
    # 5. 提交、回滚事务
    conn.commit()
except Exception as err:
    print("更新失败:", str(err))
    # 回滚事务
    conn.rollback()
finally:
    # 6. 关闭游标
    cursor.close()
    # 7. 关闭连接
    conn.close()

删除数据:

"""
删除名称为‘西游记’的图书
delete from t_book where title = '西游记';
1. 导包
2. 建立连接
3. 获取游标
4. 执行 delete 语句
5. 提交、回滚事务
6. 关闭游标
7. 关闭连接
"""
# 1. 导包
import pymysql
conn = None
cursor = None
try:
    # 2. 建立连接
    conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                            password="iHRM_student_2021",
                            database="test_db", charset="utf8")
    # 3. 获取游标
    cursor = conn.cursor()
    # 4. 执行 delete语句。
    cursor.execute("delete from t_book where id = 151;")
    print("影响的行数:", conn.affected_rows())
    # 5. 提交、回滚事务
    conn.commit()
except Exception as err:
    print("更新失败:", str(err))
    # 回滚事务
    conn.rollback()
finally:
    # 6. 关闭游标
    cursor.close()
    # 7. 关闭连接
    conn.close()

二、数据库工具类封装

1、封装的目的

  • 将 常用的数据库操作,封装到 一个方法。 后续再操作数据库时,通过调用该方法来实现。
  • 提高代码的 复用性!

2、设计数据库工具类

# 封装数据库工具类

class DBUtil(object):
    @classmethod
    def __get_conn(cls):
        pass

    @classmethod
    def __close_conn(cls):
        pass

    # 常用方法:查询一条
    @classmethod
    def select_one(cls, sql):
        pass

    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        pass

3、实现类方法

3.1 获取、关闭连接

# 封装数据库工具类
class DBUtil(object):
    # 添加类属性
    conn = None
    @classmethod
    def __get_conn(cls):
        # 判断 conn 是否为空, 如果是,再创建
        if cls.conn is None:
        cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                                password="iHRM_student_2021", database="test_db",
                                charset="utf8")
        # 返回 非空连接
        return cls.conn

    @classmethod
    def __close_conn(cls):
        # 判断,conn 不为空,需要关闭。
        if cls.conn is not None:
        cls.conn.close()
        cls.conn = None

3.2 查询一条记录

# 封装数据库工具类
class DBUtil(object):

    # 常用方法:查询一条
    @classmethod
    def select_one(cls, sql):
        cursor = None
        res = None
        try:
            # 获取连接
            cls.conn = cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行 查询语句
            cursor.execute(sql)
            # 提取一条结果
            res = cursor.fetchone()
        except Exception as err:
            print("查询sql错误:", str(err))
        finally:
            # 关闭游标
            cursor.close()增删改数据
            # 关闭连接
            cls.__close_conn()
            # 将查询sql执行的 结果,返回
            return res

if __name__ == '__main__':
    res = DBUtil.select_one("select * from t_book;")
    print("查询结果为:", res)

3.3 增删改数据

# 封装数据库工具类
class DBUtil(object):
    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 获取连接
            cls.conn = cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行 uid 语句
            cursor.execute(sql)
            print("影响的行数:", cls.conn.affected_rows())
            # 提交事务
            cls.conn.commit()
        except Exception as err:
            # 回滚事务
            cls.conn.rollback()
            print("增删改 SQL 执行失败:", str(err))
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.__close_conn()

if __name__ == '__main__':
    DBUtil.uid_db("update t_book set is_delete = 1 where id = 1111;")

3.4 完整封装代码实现

import pymysql

# 封装数据库工具类
class DBUtil(object):
    # 添加类属性
    conn = None
    @classmethod
    def __get_conn(cls):
        # 判断 conn 是否为空, 如果是,再创建
        if cls.conn is None:
        cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                                password="iHRM_student_2021", database="test_db",
                                charset="utf8")
        # 返回 非空连接
        return cls.conn

    @classmethod
    def __close_conn(cls):
        # 判断,conn 不为空,需要关闭。
        if cls.conn is not None:
        cls.conn.close()
        cls.conn = None

    # 常用方法:查询一条
    @classmethod
    def select_one(cls, sql):
        cursor = None
        res = None
        try:
            # 获取连接
            cls.conn = cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行 查询语句
            cursor.execute(sql)
            # 提取一条结果
            res = cursor.fetchone()
        except Exception as err:
            print("查询sql错误:", str(err))
        finally:
            # 关闭游标
            cursor.close()增删改数据
            # 关闭连接
            cls.__close_conn()
            # 将查询sql执行的 结果,返回
            return res

    # 常用方法:增删改
    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 获取连接
            cls.conn = cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行 uid 语句
            cursor.execute(sql)
            print("影响的行数:", cls.conn.affected_rows())
            # 提交事务
            cls.conn.commit()
        except Exception as err:
            # 回滚事务
            cls.conn.rollback()
            print("增删改 SQL 执行失败:", str(err))
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.__close_conn()

if __name__ == '__main__':
    res = DBUtil.select_one("select * from t_book;")
    print("查询结果为:", res)
    DBUtil.uid_db("update t_book set is_delete = 1 where id = 1111;")

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

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

相关文章

代码随想录训练营第七天

专题:哈希表 题目:四数相加 题目简单:把四个数组分成两队,然后用map,保存前两个数组的元素之和,(key,val)key保存的是前两个数组的元素之和的数值,val保存的是数值对应…

PDF设置密码保护的两种方法

PDF文件可以根据需要,设置两种密码来保护文件。 需要保护文件内容,不想PDF被随意打开,我们可以设置打开密码,这样只有输入正确的密码才能打开文件。 在编辑器中打开PDF后,找到菜单中【保护】选项下的【密码加密】&am…

SpringCloud01

1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构:将业务的所有功能集…

33-98-spark-核心编程-RDD算子和任务阶段等

33-spark-核心编程-RDD: 1、RDD的创建,4中方式。分别是从内存中创建,从文件中创建,从其他RDD创建和new RDD,后两者不常用。 创建:big-data-study\Spark-demo\src\main\java\spark\core\com\zh\rdd\builde…

PTA-基础编程题目集(函数题)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【[PTA刷题训练营]】 目录6-1 简单输出整数6-2 多项式求值(重点掌握)6-3 简单求和6-4 求自定类型元素的平均6-5 求…

医院陪诊小程序怎么开发-医院陪诊小程序源码功能

目前医院陪诊新型行业已经占据了很大的市场所在,我们去医院看病找医生挂号帮忙取药有时候去外地人生地不熟的 自己转半天摸索不过来浪费时间 而且有时候一个人需要陪同比较放心,所以呢衍生出来了 热门的陪诊师 如何开发? 开发无非就是几种 …

如何为 Longhorn 扩展对象存储能力

作者: 王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作…

软件包管理器RPM与yum

1、RPM安装软件包 安装单个rpm软件包 下载JDK8u221的rpm软件包 链接:https://pan.baidu.com/s/1fYKNNM02GBh-cOUuajkBIg 提取码:yg53 上传JDK8u221的rpm软件包到虚拟机/opt目录 命令:rpm -ivh jdk-8u221-linux-x64.rpm 查看JDK版本 命令&a…

C语言split分割字符串

C语言split分割字符串。 //以下解法的前提是,先把所有环变成1.无环路,2.一个环没有扣住3个及以上的其他环 voidmain(){ intarray[16]{0}; //init,array[1]xxx;根据输入初始化数组,如1-2,则,array[1]2,... intHash…

在线人事管理系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):本系统按功能分为以下几个模块: “简易云”是这个系统的名字 (1)登录页面:实…

【HMS Core】华为统一扫码服务ScanKit如何获取具体条码的类型?

1、问题描述 项目中接入了华为的统一扫码服务SDK,识别过程正常,但是目前有个需求,需要在扫码完成之后根据条码的具体类型处理接下来的业务。 问题是:识别完条形码后,如何拿到具体的条形码和二维码类型,比…

从零搭建本地pypi镜像源1:快速体验

前言: 许多公司,出于数据安全与知识产权的原因,在公司内部搭建局域网进行算法开发。配置一个本地的pypi镜像源对工程开发十分重要。搭建本地pypi镜像源的工具有多种,本文主要介绍pip2pi方法。 第一步:新建项目&#…

间接采购品类多,机械制造企业如何破局制胜优化间采管理?

受贸易政策和能源结构转型等宏观因素的叠加影响,当前机械制造业的市场环境正在迅速变化。过去几十年来,全球经济的有利形势迅速逆转,复杂的国际形势也影响了区域乃至全球贸易平衡。在国内,疫情频发、产业升级、能源转型、“双碳”…

10个提高生产力的 Linux 命令与技巧,用完直接起飞

文章目录一、前言二、使用tab键进行补全2.1 使用Tab键补全命令2.2 使用Tab键补全路径2.3 使用Tab键补全参数三、切换回上一个工作目录四、返回用户主目录五、搜索您使用过的命令六、移至行首或行尾七、快速删除八、使用 less读取文件九、格式化输出结语一、前言 在本文中&…

多数据源解决分布式事务

环境:ideaspringboot2.x 场景:调用addUser方法执行对两个数据库的表操作,如果方法出现异常就回滚 user数据库中的users表 order数据库中的order_number表 将各自的事务管理器改为统一事务管理器即可 第一步pom文件配置jta atomikos 依赖 &l…

Acwing-872. 最大公约数

d | a, a | b > d | ax by (a, b) (b, a mod b) 证明:a mod b a - [a / b] * b a - c * b 注:[ ] 为下取整符号,[a / b] 记为c 所以,(a, b) (b, a - c * b) &#xf…

FFmpeg基础到工程-多路H265监控录放开发学习笔记

多路H265监控录放开发学习笔记 课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 具体内容包括: 一、视频监控的架构和流程 二、FFmpeg4.3SDL2Qt5开发环境的搭建 三、FFmpeg的…

Chomsky文法

一、实验原理 了解0123型文法的定义并会判断各个文法,会编写并利用程序进行0123型文法的判断 二、实验目的 由于不同文法的判断归根结底是对产生式中不同终结符和非终结符个数的判断,所以在程序中先放置三个字符串集合用以存储终结符、非终结符、产生…

git clone info/refs not valid: is this a git repository问题解决

项目场景: 在我们使用gitlab克隆代码时候,发现无法克隆,遇到如下问题 $ git clone http://192.168.2.x/product/demo.git Cloning into zhlx-web-bpmn... fatal: http://192.168.2.x/product/demo.git/info/refs not valid: is this a gi…

几张图片生成3D模型?距离真正的AI建模还有多远?

时间溯回,早在2017年,美图秀秀就曾引入人工智能美化人像而被谷歌誉为“最佳娱乐App”。智能技术奔腾发展,今年的AIGC技术可谓在各行各业大放异彩,从AI绘画、AI写作到AI配音,人工智能技术自动生成内容已经成为继UGC、PG…