詳解使用Python寫一個向數據庫填充數據的小工具(推薦)
一. 背景
公司又要做一個新項目,是一個合作型項目,我們公司出web展示服務,合作伙伴線下提供展示數據。
而且本次項目是數據統(tǒng)計展示為主要功能,并沒有研發(fā)對應的數據接入接口,所有展示數據源均來自數據庫查詢,
所以驗證數據沒有別的入口,只能通過在數據庫寫入數據來進行驗證。
二. 工具
Python+mysql
三.前期準備
前置:當然是要先準備好測試方案和測試用例,在準備好這些后才能目標明確將要開發(fā)自動化小工具都要有哪些功能,避免走彎路
3.1 跟開發(fā)溝通
1)確認數據庫連接方式,庫名 ;
2)測試所涉及到的表名;
3)每個表是對哪部分業(yè)務造成影響;
4)表之間的關聯(lián)關系,同業(yè)務模塊之間的不同表之間是否有關聯(lián)字段;
5)表中個字段數據是否有特殊來源,如用戶ID、廠商名稱一類與業(yè)務有一定關聯(lián)程度的字段,一定要確認好是可以隨機生成的 還是 需要從指定表中獲取字段
3.2 設計小工具最終要實現(xiàn)的效果
我設計這個小工具就希望它可以完成兩件事情
1) 生成sql語句,并且能寫入進入mysql數據庫
2) 數據我寫入sql的統(tǒng)計結果,方便使用它直接與頁面結果進行比對
3.3 給自己加個油! 我一定可以的!
四.開始編程
***因為代碼內實際業(yè)務邏輯比較強,所以下面只寫出一些示例啦~
4.1 先處理一下基礎數據
1)因為我將要寫入的內容涉及到全國的省市名稱和省市行政區(qū)域代碼,所以先找開發(fā)要了一個他們使用的全國省市名稱及代碼對照json,然后處理成字典格式備用
2)編寫寫入sql的語句頭
通過配置文件的方式將各個表的寫入語句的前半句語法格式和寫入字段名稱編輯好。
之后每次使用的時候只需通過配置文件讀取對應表的寫入語句再拼裝上要寫入的內容就是一個完整的sql語句了
使用配置文件的模式主要是可以統(tǒng)一管理,并且可以保持后面生成環(huán)節(jié)的代碼整潔
[veh_scrap] veh = INSERT INTO zqy_veh_scrap_sto (zqy_id, vin, pack_num, scrap_time, bat_is_scrap,wmi,epname,epcode,province_code,city_code,submit_time) values
4.2 編寫工具模塊
1)編寫隨機工具
因為寫入的內容大部分字段需要不重復,所以使用random模塊,定義不同的方法生成各種類型隨機數據,如隨機身份證號 隨機姓名 隨機編碼 隨機ID 等等...
再生成寫入數據的時候,就可以引用這個隨機工具模塊引用里面的方法取隨機值,以保證寫入數據的唯一性
例:
def random_vin(): """ 生成隨機vin :return: """ return ''.join( random.sample(['Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], 17))
2)pyMysql模塊引入并封裝可用工具
因為最終要將內容寫入,所以要使用pyMysql模塊,將組裝好的sql語句執(zhí)行寫入
需要封裝的內容有 數據庫鏈接 獲取游標 語句執(zhí)行方法 數據庫查詢方法 刪除語句方法
例:
def get_conn(): conn = pymysql.connect( host=, port=, user=, password=, database=, charset='utf8') return conn def execut_sql(sql): try: conn = get_conn() cur = conn.cursor() cur.execute(sql) conn.commit() print("數據庫執(zhí)行成功") cur.close() except Exception as e: print(str(e)) print(sql) # 有異常就回滾 conn.rollback() # 關閉連接 cur.close() conn.close() def select_one_sql(sql): try: conn = get_conn() cur = conn.cursor() cur.execute(sql) results = cur.fetchone() #print(results) cur.close() return results except Exception as e: print(str(e)) # 關閉連接 cur.close() conn.close()
3)讀取配置的模塊
因為我們將sql語句的頭通過配置文件進行管理,那么就需要一個讀取配置的模塊或方法,因為我比較菜 所以為了看起來更加清晰 就用模塊來進行管理了
import configparser cfg_path = 'rebulid_generate_sql_git\base_data\sql_header.ini' cfg = configparser.ConfigParser() cfg.read(cfg_path,encoding='utf-8') def get_config_data(section,options): return cfg.get(section,options)
4) 編寫生成寫入信息的方法
因為我們在處理基礎數據的時候就已經寫好了sql寫入語句頭了,所以現(xiàn)在只要生成它后面的values值就可以了,這步就是生成他values值的步驟
創(chuàng)建一個列表,根據寫入語句內字段的順序生成對應字段的值并添加至創(chuàng)建的列表中。對應字段的內容如果是隨機值,就使用之前準備好的隨機模塊,使用里面的方法生成隨機值;如果是需要從其他表中獲取的值,則通過封裝好的qymysql的查找方法進行搜索并引用。
例:
def recycle_veh_scrap(prov, city): """ 報廢車輛入庫表 :return: """ prov_info = random_util.random_city_code(prov, city) # 獲取當地所有公司信息 company = search_factory_info.get_company_data(prov, city) # 獲取vin vin = random_util.random_vin() # 生成數據容器 insert_data = [] # 生成隨機zqy_id,寫入列表 insert_data.append(random_util.random_id()) # 生成隨機vin,寫入列表 insert_data.append(vin) # 生成隨機電池包數,寫入列表 insert_data.append(random.randint(1, 10)) # 生成報廢時間,寫入列表 insert_data.append(random_util.random_date()) # bat_is_scrap insert_data.append('1') # wmi insert_data.append(vin[0:3].upper()) # 生成報廢企業(yè)名稱,寫入列表 insert_data.append(company[0]) # 生成報廢企業(yè)代碼,寫入列表 insert_data.append(company[1]) # 獲取省級代碼,寫入列表 insert_data.append(prov_info[0]) # 獲取市級代碼,寫入列表 insert_data.append(prov_info[1]) # 數據提交時間為當前數據生成時間,寫入列表 insert_data.append(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))return insert_data
5) 編寫統(tǒng)計方法
因為我們寫入的值是隨機的,所以沒有標準去判斷最終系統(tǒng)寫入的內容是否正確。
那就需要我們將需要對比的值取出保存并統(tǒng)計,用于最后對照使用。
取值的過程會在語句寫入之前一步完成,現(xiàn)在要先準備一個數據處理的模塊,以便對取出的至進行統(tǒng)計。
可以先準備幾個比較常用的,例如列表內同類值 列表內數值求和 字典合并等方法,如果后面再有更復雜的格式,再單獨編寫。
例:
def TongJiQi(list): # 列表內容統(tǒng)計器,對列表內的重復項進行數量統(tǒng)計 count_dict = dict() for item in list: if item in count_dict: count_dict[item] += 1 else: count_dict[item] = 1 return count_dict def qiuhe(data_list): """ 對列表內的數值進行求和 :param data_list: :return: """ total = 0 for ele in range(0, len(data_list)): total = total + data_list[ele] return total
以上,準備工作就都做好了,下面就要開始真正的寫入了
4.3 生成數據并拼裝為sql語句
1) 通過生產sql語句數量來控制循環(huán),將sql頭與值拼裝在一起,并將拼裝好的結果進行寫入
2) 在循環(huán)生成寫入值的過程中,將需要統(tǒng)計或計算的值取出單獨保存,在寫入結束后再進行技術統(tǒng)計輸出統(tǒng)計結果
def write_sql(prov, city, des_prov, des_city) # 通過配置文件獲取sql頭 sql = config_util.get_config_data('veh_scrap', 'pack_out') # 控制循環(huán) i = 0 # 創(chuàng)建列表,用于收集需要統(tǒng)計計算的數據 company_num = [] des_company_num = [] while i < sql_num: i += 1 # 取生成的values值 data = _crap_out(prov, city, des_prov, des_city) # 收集需要統(tǒng)計的數據 company_num.append(data[8]) des_company_num.append(data[4]) # 拼裝sql語句 sql = sql + str(tuple(data)) + ',' # 最后一組數據后的,刪除掉 right_sql = sql.strip(',') # 拼裝上結尾的; fullsql作為返回值 full_sql = right_sql + ';' # print(full_sql) # 執(zhí)行寫入 pymysql_util.execut_sql(full_sql) print('上報企業(yè)統(tǒng)計: ' + str( statistics_util.TongJiQi(company_num))) print('去向企業(yè)統(tǒng)計: ' + str( statistics_util.TongJiQi(des_company_num)))
這樣一個表的數據就寫入成功了,只需要調整寫入條數就可以想寫入多少條就寫入多少條,還可以直接輸出你關心的字段統(tǒng)計結果。
多個數據庫表的話可以就是將以上的生產數據和寫入數據的步驟復制,按照表名和字段稍作修改就可以了。
再將所有表的數據生成和寫入都編寫完成后,可以編寫一個小工具的入口,給自己編寫一個選擇器
每次只要輸入對應的數字就可以執(zhí)行對應的方法,寫入數據并輸出統(tǒng)計結果啦
def main(prov, city, sql_num, sour_prov, sour_city): """ 啟動數據自動寫入的主方法 :return: """ features_type = input("請選擇生成數據所屬功能模塊 1.車輛報廢 2.梯次利用 3.資源再生") if features_type == '1': scrapped_main.write_sql(prov, city, sql_num, des_prov=sour_prov, des_city=sour_city) elif features_type == '2': echelon_use_main.write_main(prov, city, sql_num, sour_prov, sour_city) elif features_type == '3': recycle_main.write_main(sql_num, prov, city, sour_prov, sour_city)
五.總結
以上只是一個工作過程中倉促搞出的一個小東西,還有很多不足。拋轉引玉,拿出來跟大家分享一下我的思路,希望能對大家有所幫助!
還有我趟過的坑,也記錄一下吧
1.不要只管悶頭寫,寫完一個表的時候就執(zhí)行試一下,不只要看數據庫寫進去了 主要是看看要測試的平臺能不能看到,之前因為開發(fā)忘了跟我說一個字段條件,我全都寫完了也執(zhí)行成功了,但就是上不去平臺,最后不得不大改一遍
2.隨時跟開發(fā)溝通確認任何一個不確定的問題,因為有的表可能會用不到,表內的某些字段沒有用,表設計不明確的時候等等,這些時候都要跟他們確認好再繼續(xù)動手寫,防止無用功。
3.這只是輔助測試的工具,要控制住開發(fā)工具的時間,防止測試工作的延誤。
到此這篇關于詳解使用Python寫一個向數據庫填充數據的小工具(推薦)的文章就介紹到這了,更多相關Python向數據庫填充數據的小工具內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python庫urllib與urllib2主要區(qū)別分析
這篇文章主要介紹了Python庫urllib與urllib2主要區(qū)別,需要的朋友可以參考下2014-07-07