Python脚本之连接数据库

在执行Python自动化脚本的用例,有产生测试数据,但我很少去数据库做连接查询,但是这一部分总得会,总有用上时候。
没想到最近有用到,所以这期分享下Python连接数据库的操作。

pymysql 连接数据库

情景一

先说下具体的情景:
web页面测试,有这样一需求是 中间的Closing Balance会每十分钟刷新一次;当产品给我说后,我就懵了,这玩意咋测?

我不太想,每数着十分钟查看一次数据(十分钟也有可能因为没有交易,数值保持不变)。
在这里插入图片描述
我找后台同学,了解到这个十分钟的值 保存在某张表的create_time字段;然后想到可以用后面的值和前面的值做个减法,差小于等于十分钟就好。因为这个Closing Balance 对应一个gateway是“iris”的;此外还有5个不同gateway,也是10分钟更新一次6个gateway的值;

我最初的思路: 完全可以用第N个减掉 第N-6个,差小于等于十分钟【虽然有可能是前后相减的是不同gateway类型的值,但是因为这6个每次必查,并且每次查询时间很近很近,可以忽略相减的是不同gateway这个情况】;

第二版:第一版 + 必须保证create_time 在那个更新时间【后台定的是每小时的整点、10分、20分、30分、40分、50分】附近,不然每次都偏一点,最后结果会天差地别;

第三版:查询数据时候加个条件gateway=“iris”,第N个值减掉第N-1个值,差小于等于十分钟; 【后面有进一步的优化】

前两个版本就不分享,分享下第三版初稿:
下面是写的 读取数据库某表这个字段的所有值 的方法;

    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()
            # print(result)
            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-6] <= 600000
            assert fun[n] - fun[n-1] <= 660000      # 11分钟

情景二

情景是: 后台每天会定时拉取另一个系统的交易数据,要查询这些交易的拉取时间;其实思路和前面很相似,只是因为这边交易数据量不确定,整个表所有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分的时间戳】。

情景一 代码优化

从情景二看到,每天写时间戳很不智能。说回来情景一,要对第三版添加 create_time 的新检验【增加对 create_time 与定时时间的校验】
实际情景一是每小时的整点、10、20、30、40、50这6个固定时间来
在这里插入图片描述
我最初陷入时间戳的思路,想得是能不能做个循环来获取每天的固定时间【整点、10分、20分、30分、40分、50分】的时间戳,奈何没想到。

然后突然想到把时间戳转为普通格式str,切片后再做分钟、秒的断言,也是可以实现验证的【1.验证固定时间【分】 2.验证实际时间【秒】】。

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

发布了78 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/87874849