【测试】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 小时前
什么是事务?并发事务引发的问题?什么是MVCC?
数据库
泡泡Java1 小时前
postgresql链接详解
数据库·postgresql
雾里看山1 小时前
【MySQL】内置函数
android·数据库·mysql
程序媛_2 小时前
【DBeaver】Oracle数据库连接报错:驱动程序 ‘Oracle‘ 的配置错误的解决办法
数据库·oracle
圆内~搁浅2 小时前
langchain本地知识库问答机器人集成本地知识库
数据库·langchain·机器人
早起的年轻人3 小时前
Docket Desktop 安装redis 并设置密码
数据库·redis·缓存
xlxxy_3 小时前
ABAP数据库表的增改查
开发语言·前端·数据库·sql·oracle·excel
清水加冰3 小时前
【MySQL】索引
数据库·mysql
qw9494 小时前
Redis(高阶篇)03章——缓存双写一致性之更新策略探讨
数据库·redis·缓存