python 数据库操作(pymysql.connect、游标cursor.execute(fetchone、fetchmany、fetchall))、数据库封装

做测试的时候总是有些场景需要用到数据库的:
场景一: 查询并获取数据-- 比如验证码查询【测试环境里】
场景二:构造测试数据避免重复,查询校验数据是重复 – 用户名 手机号码
不能重复。
场景三: 进行数据库数据确认,确认测试结果;数据库断言。

接口测试 没有界面直观判断。

常见数据操作的库:

引入操作Oracle数据库模块安装命令: pip install cx_Oracle

引入操作SQLServer数据库模块安装命令: pip install pymssql

引入操作MySQL数据库模块安装命令: pip install PyMySQL

SQLite数据模块不需要安装,系统自带。

选择pymysql。其他的数据库功能库操作语法大同小异,可以触类旁通。

安装

pymysql 第三方库 == 安装 导入

import pymysql
 # 第一步:连接数据库,获取对象
conn = pymysql.connect(
    user="xxxxxx",
    password="xxxxx",
    database="xxxxx",
    port=3306,
    host="xxx.xxxx.com",
    charset="utf8mb4",  # 中文字符集 语法记住即可
)

cur.fetchone() – # 从查询集结果当中,获取一条数据
cur.fetchmany(size=行数) — # 从查询结果集当中,获取指定条数的数据。
cur.fetchall() — # 从查询结果集当中,获取所有的数据。

  • 执行结果是元组的格式保存,每个表的字段的值作为元组的元素。
    (3006, ‘13555554444’, ‘13555554444’, ‘验证码464323,您正在注册成为新用户,感谢您的支持!’, ‘464323’, 12, datetime.datetime(2023, 11, 22, 20, 12, 21), None, 0)
  • 多条结果: 元组嵌套元组的格式保存数据。

注意: 数据读取从游标位置读取。前面的查询语句会影响后面的查询结果。如果不想要影响,可以每次查询新的sql,新创建游标

思考: 数据库结果默认放在元组里,不方便识别数据类型和意义。最好能放在字典格式里 标识数据更好。
cursorclass=pymysql.cursors.DictCursor # 数据库查询结果就是字典的格式保存。
- 直接用数据库表的字段名字作为字典的key作为标识。
- 一条结果是字典格式
- 多条结果,列表嵌套字典的格式。


import pymysql
from pymysql.cursors import DictCursor

# 第一步:连接数据库 获取对象
conn = pymysql.connect(
    user="xxxxxx", #用户名
    password="xxxxx",  #密码
    database="xxxxxx", #数据库名字
    port=3306,   #端口
    host="xxxx.xxxxx.xxxx", #域名
    charset="utf8mb4",
    cursorclass=DictCursor  # 数据库查询结果就是字典的格式保存。
)

# 第二步:查询(执行sql语句),执行之前,需要获取游标
cursor = conn.cursor()

# 第三步:执行sql == 得到查询结果的数量 没有得到具体的执行数据
# sql = 'select * from tz_sms_log where user_phone = "13555554444" order by rec_date desc limit 1;'
sql = 'select * from tz_sms_log where user_phone like "1355%";'
result = cursor.execute(sql)
print(result)

# 第四步:获取具体的数据结果 ==第一行的数据
# one_row_data = cursor.fetchone()
# print(one_row_data)

# 获取具体的数据结果 ==获取多条数据,从上一次查询完成后的游标处开始获取数据。
many_data = cursor.fetchmany(size = None)
print(many_data)

# 新创建游标 不会受之前查询结果影响了。
# cursor2 = conn.cursor()
# result = cursor2.execute(sql)
# # 获取所有的结果数据 -fetchall
# all_data = cursor2.fetchall()
# print(all_data)

# 第五步: 关闭游标 和 数据库连接 : 数据库连接有数量限制,用完了这个链接 关闭链接。 释放出来。
cursor.close()
# cursor2.close()
conn.close()

运行结果如下:

30
[{'id': 429, 'user_id': '13552460107', 'user_phone': '13552460107', 'content': '验证码819958,您正在登录,若非本人操作,请勿泄露。', 'mobile_code': '819958', 'type': 13, 'rec_date': datetime.datetime(2023, 1, 13, 19, 46, 48), 'response_code': None, 'status': 0}]

数据库封装

封装类:查询操作,如果以后还要封装update 可以扩展方法。
封装类考虑以下步骤:
1、是否初始化函数init : 每个方法需要共享属性–实例属性。
2、考虑这个类里面需要有哪些方法: 动作和操作 ==查询

  • 函数封装步骤:
    • 函数体
    • def : 需要调用实例属性
    • 参数化
    • 返回值
      3、异常捕获:
      4、结合日志 记录日志。

设计一下: 用户想要查询几条数据参数。–代码设计 参考成熟工具设计。 参考Jmeter: 1 2 -1

  • match_num=1,fetchone
  • match_num=2,fetchmany
  • match_num=-1,fetchall

my_db.py内容如下:

my_db = {
    "user": "xxxxx",  #用户名
    "password": "xxxxx",  #密码
    "database": "xxxxxx",  #数据库名字
    "port": 3306,  #端口
    "host": "xxxx.xxxxx.xxxx"}  #域名
import pymysql
from pymysql.cursors import DictCursor
from loguru import logger
from datas.db_data import my_db

class HandleMysql:
    def __init__(self,user,password,database,port,host):
        """
        定义了两个实例属性: conn cursor ,可以用于后续实例方法共享。
        """
        self.conn = pymysql.connect(
            user=user,
            password=password,
            database=database,
            port=port,
            host=host,
            charset="utf8mb4",
            cursorclass=DictCursor)
        self.cursor = self.conn.cursor()
    def query_data(self,query_sql,match_num=1,size=None):
        """

        :param query_sql: 查询sql语句
        :param match_num: 用户获取条数 match_num=1,fetchone;match_num=2,fetchmany,match_num=-1,fetchall
        :param size:当match_num=2,size是查询的条数,传参。
        :return: 返回查询结果数据
        """
        try:
            result = self.cursor.execute(query_sql)  # 结果条数 >0 才有获取详细数据必要
            logger.info(f"数据库的查询结果条数为:{result}")
            if result > 0:
                if match_num==1:
                    data = self.cursor.fetchone()
                    logger.info(f"查询结果数据为:{data}")
                    return data
                elif match_num == 2:
                    data = self.cursor.fetchmany(size = size)
                    logger.info(f"查询结果数据为:{data}")
                    return data
                elif match_num == -1:
                    data = self.cursor.fetchall()
                    logger.info(f"查询结果数据为:{data}")
                    return data
                logger.warning("请传入1,2,-1的match_num")
            logger.info("数据库没有查询结果!")
        except:
            logger.error("数据库操作异常!")
        finally:
            self.cursor.close()
            self.conn.close()

if __name__ == '__main__':
    sql = 'select * from tz_sms_log where user_phone like "1355%";'
    result = HandleMysql(**my_db).query_data(sql,match_num=2,size=5)
    print(result)
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值