在执行Python自动化脚本的用例,有产生测试数据,但我很少去数据库做连接查询,但是这一部分总得会,总有用上时候。
没想到最近有用到,所以这期分享下Python连接数据库的操作。
个人博客:https://blog.csdn.net/zyooooxie
PyMySQL 连接数据库
PyMySQL是一个用于Python的纯Python MySQL客户端库,用于连接和操作MySQL数据库。它是在Python的标准DB-API接口上构建的,提供了简单易用的API,使开发人员可以轻松地在Python中进行MySQL数据库的操作。
https://pymysql.readthedocs.io/en/latest/user/installation.html
情景一
有这样一个需求是 某web页面,中间的Closing Balance 会每十分钟刷新一次;
当产品给我说后,我就懵了,这玩意咋测?我不想,每数着十分钟查看一次数据(十分钟也有可能因为没有交易,数值保持不变)。
找后台同学了解到:这个十分钟的更新时间 保存在某张表的create_time字段;
然后我想到可以用后面的值和前面的值做个减法,差小于等于十分钟就好。因为这个Closing Balance 对应6个gateway的,每次更新有6条记录;
我最初的思路: 完全可以用第N个减掉 第N-6个,差小于等于十分钟【虽然有可能是前后相减的是不同gateway类型的,但是因为这6个每次必查,并且每次查询时间很近很近,可以忽略 不同gateway这个情况】;
第二版:查询数据时候加个筛选条件 gateway = “iris”,把最初的思路的弊端 全部优化;
下面是写的 读取数据库某表这个字段的所有值 的方法;
def test_sql_con(self):
db = pymysql.connect('xxxxx', 'xx', 'xxxx', 'xxx')
cur = db.cursor()
sql_t = 'SELECT create_time FROM t_fin WHERE create_time> 1559009290000 AND gateway = "iris";'
# 2019-05-28 10:08:10开始
try:
cur.execute(sql_t)
result = cur.fetchall()
List1 = []
for i in result:
# print(i, type(i))
List1.append(i[0])
print(List1, len(List1))
return List1 # 这个地方 代码不合适
except BaseException as b1:
print('error', b1)
db.close()
下面是 递归test_j(),断言;
def test_j(self, fun, n):
if n < 2:
pass
else:
assert fun[n] - fun[n-1] <= 660000 # 11分钟
情景一 代码优化
第三版:第一版的基础上,再 保证create_time 在那个更新时间【后台定的是每小时的整点、10分、20分、30分、40分、50分】附近;
突然想到把时间戳转为普通格式str,切片后再做分钟、秒的断言,也是可以实现验证的【1.验证固定时间【分】 2.验证实际时间【秒】】。
情景二
后台每天会定时拉取另一个系统的交易数据,要查询这些交易的拉取时间;其实思路和前面很相似,只是因为这边交易数据量不确定,整个表所有create_time是要去重排序的,在对这列表的数据做个递减,断言就可以。
def test_sql_con(self):
db = pymysql.connect('a', 'aa', 'aaa', 'aaaa')
cur = db.cursor()
sql_t = 'SELECT create_time FROM t_fin_iris_transaction_statments WHERE create_time> 1560355204000;'
# 2019-06-13 00:00:04开始
# sql_t = 'SELECT create_time FROM t_fin_iris_transaction_statments WHERE create_time> 1557676800000;'
# 2019-05-13 00:00:00
try:
cur.execute(sql_t)
result = cur.fetchall()
# print(result)
List1 = []
for i in result:
# print(i, type(i))
List1.append(i[0])
print(List1, len(List1))
new_List1 = list(set(List1))
new_List1.sort(key=List1.index)
print(new_List1, len(new_List1))
return new_List1
except BaseException as b1:
print('error', b1)
db.close()
下图是test_j(),断言。
因为数据并非每天都有,所以fun[n] - fun[n - 1] 的断言出现错误;
上图中的 t1、t2代表 某天的更新时间点 【每天早上8点更新,t1就是每天7点59的时间戳,t2就是每天8点01分的时间戳】。
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie