引言

在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据、核对功能、验证数据一致性,接口的数据库操作是否正确等。因此,在进行接口自动化测试时,我们一样绕不开接口和数据库的交互,我们需要用代码连接数据库,通过操作数据库完成数据的准备、环境检查以及数据库断言的功能。在python3中,使用python操作MySQL数据库需要使用到第三方库:pymysql,该模块本质上就是一个套接字的客户端软件包,它提供了诸多连接数据库、操作数据库表等一系列的方法。

一、PyMySQL安装

1.在windows环境下安装

由于python3.6及以上版本安装python后就自带了pip3,python版本低于3.6的,手动安装下pip即可,因此可以直接使用pip安装该模块

pip3 install pymysql

2.在linux环境下安装

下载安装pymysql的tar包,解压后,进入解压的目录下,按如下安装即可:

[root@localhost opt]#tar -xzvf PyMySQL-0.7.11.tar.gz
[root@localhost opt]#cd PyMySQL-0.7.11
[root@localhost PyMySQL-0.7.11]#python36 setup.py install

3.在PyCharm中安装

在PyCharm中直接检索该模块,并安装,步骤如下:

二、Python操作数据库

因为方便测试,我们首先在mysql数据库创建测试表:userinfo,表信息如下:

有了数据库和数据表后,我们就可以导入pymysql模块,使用该模块下封装的方法实现数据库操作

数据库连接

pymysql提供的方法如下:

1. 建立数据库连接 conn = pymysql.connect()
2. 从连接建立操作游标 cur = conn.cursor()
3. 使用游标执行sql(读/写) cur.execute(sql)
4. 获取结果(读)/ 提交更改(写) cur.fetchall() / conn.commit()
5. 关闭游标及连接 cur.close();conn.close()

代码示例:

import pymysql
# 建立连接
connection = pymysql.connect(host='119.29.78.234', port=3306, user='root', password='dhcc@2020', db='test123')
cursor = connection.cursor() # 创建游标
cursor.execute("SELECT * FROM userinfo") #使用execute()方法执行SQL语句
data = cursor.fetchall() #使用fetall()获取全部数据
print(data)
cursor.close() #关闭游标和数据库的连接
connection.close()

#运行结果
((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123'), (4, '库里', '123'))

什么是游标? 游标类似文件句柄,可以逐条的访问数据库执行结果集。pymysql中只能通过游标来执行sql和获取结果

以上代码执行后,默认返回的是一个嵌套元组数据类型

数据库增删改查

查询操作:

使用cur.execute(), 执行数据库查询后无返回的是影响的行数,而非查询结果。我们要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()来获取查询结果
cur.fetchone(): 获取一条数据(同时获取的数据会从结果集删除),返回元组
cur.fetchmany(3): 获取多条数据,返回嵌套元组
cur.fetchall(): 获取所有数据,返回嵌套元组

代码示例:

查询单条数据:

import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchone() # fetchone()第一次只能查询表中的首行数据
print(res)
res = cursor.fetchone() # 第二次查询下一行数据
print(res)
cursor.close()
db.close()

# 返回结果

((1, '艾佛森', '123'))

((2, '科比', '123'))

查询多条数据:

import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchmany(3) # 第一次查询表中的前3行数据
print(res)
res = cursor.fetchmany(3) # 第二次查询下一个3行的数据
print(res)
cursor.close()
db.close()

#返回结果
((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123'))
((4, '库里', '123'),)

查询所有数据:

import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchall() # 第一次查询表中的所有数据
print(res)
res = cursor.fetchall() # 第二次查询无数据
print(res)
cursor.close()
db.close()

#返回结果
((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123'), (4, '库里', '123'))
()

 默认都是返回元组的数据类型,看起来不太直观,因此,在实例化时可以将游标设置成如下这样,就可以返回字典类型的数据

cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

#返回结果

[{'username': '艾佛森', 'id': 1, 'passwd': '123'}, {'username': '科比', 'id': 2, 'passwd': '123'}, {'username': '詹姆斯', 'id': 3, 'passwd': '123'}, {'username': '库里', 'id': 4, 'passwd': '123'}]

增删改操作:

在进行增删改,执行修改数据库的操作后不立即生效,使用连接conn.commit()提交后才生效,支持事物及回滚

代码示例:

import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES('克莱','123')"
#sql = "UPDATE userinfo SET username = '奥尼尔' WHERE username = '科比'" # 修改数据
#sql = "DELETE FROM username WHERE username ='奥尼尔'" # 删除数据
try:
cursor.execute(sql)
db.commit()
except Exception as e : # 执行异常回滚
db.rollback()
cursor.close()
db.close()
#或者在execute提供需要插入的数据
import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
try:
cursor.execute(sql,("克莱","123"))
db.commit()
except Exception as e :
db.rollback()
cursor.close()
db.close()
#批量插入数据
import pymysql
db_config = {
"host":"119.29.78.234",
"port":3306,
"user":"root",
"password":"dhcc@2020",
"db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
try:
cursor.executemany(sql,[("韦德","123"),("字母哥","123")])
db.commit()
except Exception as e :
db.rollback()
cursor.close()
db.close()

封装数据库操作

由于经常要使用到数据库操作,建议将所有数据库操作封装成公用的数据库模块

封装的代码示例如下:

import pymysql.cursors

class Operation_mysql(object):
def __init__(self):
# 建立连接
db_config = {
"host": "119.29.78.234",
"port": 3306,
"user": "root",
"password": "dhcc@2020",
"db": "test123"
}
self.connection = pymysql.connect(**db_config)
# 创建游标
self.cursor = self.connection.cursor() def execute_sql(self, sql):
try:
self.cursor.execute(sql)
self.connection.commit()
except Exception as e: # 执行异常回滚
db.rollback() def get_data(self):
data = self.cursor.fetchone()
#data = self.cursor.fetchall() # 查询所有数据
return data def close_mysql(self):
# 关闭游标
self.cursor.close()
# 关闭数据库连接
self.connection.close()

这样封装后后续接口测试用例需要操作数据库时,就可以引入该模块,实例化对象调用该模块下的方法。

基于Python的接口自动化实战-基础篇之pymysql模块操作数据库的更多相关文章

  1. 基于Python的接口自动化实战-基础篇之读写配置文件

    引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值.为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这些变量和变 ...

  2. 基于python的webUI自动化-小白基础篇

    最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...

  3. 基于Python的接口自动化-01

    为什么要做接口测试 当前互联网产品迭代速度越来越快,由之前的2-3个月到个把月,再到班车制,甚至更短,每次发版之前都需要对所有功能进行回归测试,在人力资源有限的情况下,做自动化测试很有必要.由于UI更 ...

  4. 基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  5. 基于Python的接口自动化

    第一步 Python的安装配置 打开官网: https://www.python.org/downloads/ 目前官网上已经更新到3.6.1啦,有两个版本,大家可以按自己喜欢的去下载,我自己选择的是 ...

  6. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  7. 第9期《jmeter接口自动化实战》零基础入门!

    2019年 第9期<jmeter接口自动化实战>课程,12月6号开学! 上课方式:QQ群视频在线教学 本期上课时间:12月6号-1月18号,每周五.周六晚上20:00-22:00 报名费: ...

  8. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  9. 学习Keras:《Keras快速上手基于Python的深度学习实战》PDF代码+mobi

    有一定Python和TensorFlow基础的人看应该很容易,各领域的应用,但比较广泛,不深刻,讲硬件的部分可以作为入门人的参考. <Keras快速上手基于Python的深度学习实战>系统 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象的toolButtonStyle属性

    tooButtonStyle属性保存主窗口工具栏按钮的样式设置,用来表示工具栏按钮的文字和图标怎么显示. 该属性的可设置值类型为枚举类型Qt.ToolButtonStyle,它包含如下值: 该属性的缺 ...

  2. 使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

    PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...

  3. 深海 => 暴力扫描挖掘机

    平时总是联动这个联动那个,写一些小脚本,感觉零碎又没啥意思,想把市面上一些比较知名的工具集合一下,弄个方便点的躺着挖洞的工具,看看效果会不会更好,暂时名字取深海吧,估计又是一个迟迟不填的坑,灌灌灌灌水

  4. VirtualBox安装Centos出现E_FAIL (0x80004005)的解决方法

    问题描述:UUID已经存在 Cannot register the hard disk 'F:\hadoop\VirtualBox-centos\centos6.4\centos6.4.vdi' {0 ...

  5. Springboot中redisTemplate乱码或json转换问题

    问题1 用RedisTemplate存入map值的时候,用rdm可视化打开,看到的是转码之后的数据,如图: 存入的方法为: public boolean hmset(String key, Map&l ...

  6. 百度前端技术学院-基础-day1

    2020.9.14 今天我开始在百度前端技术学院学习基础课程. 先立一个Flag,希望我能在30天之内学完前四十天的课程,后续课程再一天一节. 第一天的内容主要是提供了很多基础学习的网页,比如W3sc ...

  7. 哪些地方会出现css阻塞,哪些地方会出现js阻塞?

    js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等. 直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 为了提高用户体验,新一代浏 ...

  8. 通过CSS绘制五星红旗

    任务要求: 1.创建一个div作为红旗旗面,用CSS控制其比例宽高比为3:2,背景为红色. 2.再创建五个小的div,用CSS控制其大小和位置. 3.用CSS同时控制每个小div的大小.边框和位置,同 ...

  9. CF1147F Zigzag Game & 稳定婚姻问题学习笔记

    CF1147F Zigzag Game 这题太神仙了,不得不记录一下. 我网络流做不动了,DS做不动了,DP做不动了,特别自闭.于是博弈论之神(就是随手切3500博弈的那种) \(\color{bla ...

  10. nginx转发上传图片接口图片的时候,报错413

    我这边有一个接口是上传图片,使用nginx进行代理,上传大一点的图片,直接调用我的接口不会报错,但是调用nginx上传图片就会报错"413 Request Entity Too Large& ...