【测试】PyMySQL的使用

长期更新补充,建议关注收藏点赞!

目录

简介

安装

pip install pymysql

  • 应用场景:
    • 接口自动化测试中关于数据库:校验测试数据、构造测试数据
      校验数据的背景是当响应结果中没有时,就需要查看数据库里的数据
      构造测试数据的背景是测试接口前不能确定数据是否已存在;以及 测试数据使用一次就不可再用的情况。

使用

import 导包->创建connection->获取cursor->执行增删改查->关闭cursor->关闭connection

建立一个连接即可,cursor可以有多个,从指针cursor位置提取其后一行,移动一行。

如果变量名被当成系统关键字,则需要用``包起来,如read=read+2

python 复制代码
# 总体使用方法
import pymysql
conn=pymysql.connect()
cursor=conn.cursor()
cursor.execute("SQL language")

#select
fetch#提取数据

#insert,update,delete,
conn.commit()#成功,提交事务
conn.rollback()#失败,回滚事务

cursor.close()
conn.close()

#fetch
fetchone()#提取一行
fetchmany(size)#提取size行
fetchall()#提取全部
cursor.rownumber=0 #设置cursor位置 以行为单位 0为文件头

# 实例
conn=pymysql.connect(host="",port=0,user="",password="",database="",charset="")
'''
host 数据库主机ip地址
port int格式
database 要连接的数据库名
charset 字符集 utf8

conn返回成功连接数据库的对象
'''
cursor=conn.cursor()
cursor.execute("select version()")
result=cursor.fetchone()
print(result)
cursor.close()
conn.close()

#可以加入异常捕获
conn=None
cursor=None
try:
	....
	conn.commit()
except Exception as err:
	print(str(err))
	conn.rollback()
finally:
	cursor.close()
	conn.close()

#查看语句执行影响多少行
print(conn.affected_rows())

封装复用

  • 封装成设置文件
  • 封装类
python 复制代码
#config/setting.py
# 数据库信息配置
DB_CONFIG = {
    "host": "127.0.0.1",
    "user": "root",
    "password": "123456",
    "database": "test",
    "port": 3306,
    "charset": "utf8"
}

#utils/mysqlutil.py
# 导入PyMySQL库
import pymysql
# 导入数据库的配置信息
from config.settings import DB_CONFIG

class MysqlUtil:
    def __init__(self):
        # 读取配置文件,初始化pymysql数据库连接
        self.db = pymysql.connect(**DB_CONFIG)
        # 创建数据库游标  返回字典类型的数据
        self.cursor = self.db.cursor(cursor=pymysql.cursors.DictCursor)
 
    # 获取单条数据
    def get_fetchone(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchone()
 
    # 获取多条数据
    def get_fetchall(self, sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()
 
    # 执行更新类sql
    def sql_execute(self, sql):
        try:
            # db对象和指针对象同时存在
            if self.db and self.cursor:
                print("sql是", sql)
                self.cursor.execute(sql)
                # 提交执行sql到数据库,完成insert或者update相关命令操作,非查询时使用
                self.db.commit()
                print("sql执行成功~!")
        except Exception as e:
            # 出现异常时,数据库回滚
            self.db.rollback()
            return False
 
    # 关闭对象,staticmethod静态方法,可以直接使用类名.静态方法
    @staticmethod
    def close(self):
        # 关闭游标对象
        if self.cursor is not None:
            self.cursor.close()
        # 关闭数据库对象
        if self.db is not None:
            self.db.close()
 
 
if __name__ == '__main__':
    mysql = MysqlUtil()
    res1 = mysql.get_fetchone("select * from case_list")
    print(res1)
    res2 = mysql.get_fetchall("select * from case_list")
    print(res2)
    res3 = mysql.sql_execute("insert into test_result_record (case_id,result) values ('9999','测试通过');")
    print(res3) 
    mysql.close
	del mysql#手动释放
python 复制代码
#类方法版本
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()
python 复制代码
#其他文件里调用使用封装好的工具
from myutils import DBUtil
res = DBUtil.select_one("select * from t_book;")
#类方法的调用 不需要创建实例 直接调用
print("查询结果为:", res)
DBUtil.uid_db("update t_book set is_delete = 1 where id = 1111;")
  • 封装解决了代码冗余、代码耦合度高、代码维护成本高。
    • 耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
      模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
相关推荐
r i c k20 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦34 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露3 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot