在執行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