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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章