【测试】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)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
      模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
相关推荐
西瓜味儿的小志1 小时前
Redis的大key和热key问题
数据库·redis·缓存·中间件
练小杰5 小时前
我在广州学 Mysql 系列——有关数据表的插入、更新与删除相关练习
android·运维·数据库·经验分享·学习·mysql·adb
silence2506 小时前
oracle基础:将字段从 VARCHAR 修改为 CLOB
数据库·oracle
2301_767233226 小时前
数据库中的并发控制
数据库·oracle
->yjy6 小时前
数据库系统概论期末复习
数据库·oracle
huaqianzkh6 小时前
反规范化带来的数据不一致问题的解决方案
数据库·系统架构
睿思达DBA_WGX6 小时前
Oracle Dataguard(主库为单节点)配置详解(1):Oracle Dataguard 工作原理
数据库·oracle
精神病不行计算机不上班6 小时前
【数据库系统概论】数据库恢复技术--复习
开发语言·数据库·oracle
加勒比之杰克7 小时前
【数据库初阶】MySQL数据类型
linux·数据库·mysql·数据类型·varchar
Libby博仙7 小时前
asp.net core webapi中的数据注解与数据验证
数据库·asp.net·.netcore