【测试】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)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
      模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
相关推荐
·薯条大王3 小时前
MySQL联合查询
数据库·mysql
morris1314 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch5 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
这个懒人6 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
Yan-英杰6 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
NineData6 小时前
NineData云原生智能数据管理平台新功能发布|2025年3月版
数据库
百代繁华一朝都-绮罗生7 小时前
检查是否存在占用内存过大的SQL
数据库·sql
吾日三省吾码7 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化
CZIDC8 小时前
win11 系统环境下 新安装 WSL ubuntu + ssh + gnome 桌面环境
数据库·ubuntu·ssh
直裾8 小时前
Mapreduce的使用
大数据·数据库·mapreduce