詳解使用Python寫一個(gè)向數(shù)據(jù)庫填充數(shù)據(jù)的小工具(推薦)
一. 背景
公司又要做一個(gè)新項(xiàng)目,是一個(gè)合作型項(xiàng)目,我們公司出web展示服務(wù),合作伙伴線下提供展示數(shù)據(jù)。
而且本次項(xiàng)目是數(shù)據(jù)統(tǒng)計(jì)展示為主要功能,并沒有研發(fā)對(duì)應(yīng)的數(shù)據(jù)接入接口,所有展示數(shù)據(jù)源均來自數(shù)據(jù)庫查詢,
所以驗(yàn)證數(shù)據(jù)沒有別的入口,只能通過在數(shù)據(jù)庫寫入數(shù)據(jù)來進(jìn)行驗(yàn)證。
二. 工具
Python+mysql
三.前期準(zhǔn)備
前置:當(dāng)然是要先準(zhǔn)備好測(cè)試方案和測(cè)試用例,在準(zhǔn)備好這些后才能目標(biāo)明確將要開發(fā)自動(dòng)化小工具都要有哪些功能,避免走彎路
3.1 跟開發(fā)溝通
1)確認(rèn)數(shù)據(jù)庫連接方式,庫名 ;
2)測(cè)試所涉及到的表名;
3)每個(gè)表是對(duì)哪部分業(yè)務(wù)造成影響;
4)表之間的關(guān)聯(lián)關(guān)系,同業(yè)務(wù)模塊之間的不同表之間是否有關(guān)聯(lián)字段;
5)表中個(gè)字段數(shù)據(jù)是否有特殊來源,如用戶ID、廠商名稱一類與業(yè)務(wù)有一定關(guān)聯(lián)程度的字段,一定要確認(rèn)好是可以隨機(jī)生成的 還是 需要從指定表中獲取字段
3.2 設(shè)計(jì)小工具最終要實(shí)現(xiàn)的效果
我設(shè)計(jì)這個(gè)小工具就希望它可以完成兩件事情
1) 生成sql語句,并且能寫入進(jìn)入mysql數(shù)據(jù)庫
2) 數(shù)據(jù)我寫入sql的統(tǒng)計(jì)結(jié)果,方便使用它直接與頁面結(jié)果進(jìn)行比對(duì)
3.3 給自己加個(gè)油! 我一定可以的!
四.開始編程
***因?yàn)榇a內(nèi)實(shí)際業(yè)務(wù)邏輯比較強(qiáng),所以下面只寫出一些示例啦~
4.1 先處理一下基礎(chǔ)數(shù)據(jù)
1)因?yàn)槲覍⒁獙懭氲膬?nèi)容涉及到全國(guó)的省市名稱和省市行政區(qū)域代碼,所以先找開發(fā)要了一個(gè)他們使用的全國(guó)省市名稱及代碼對(duì)照json,然后處理成字典格式備用
2)編寫寫入sql的語句頭
通過配置文件的方式將各個(gè)表的寫入語句的前半句語法格式和寫入字段名稱編輯好。
之后每次使用的時(shí)候只需通過配置文件讀取對(duì)應(yīng)表的寫入語句再拼裝上要寫入的內(nèi)容就是一個(gè)完整的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)編寫隨機(jī)工具
因?yàn)閷懭氲膬?nèi)容大部分字段需要不重復(fù),所以使用random模塊,定義不同的方法生成各種類型隨機(jī)數(shù)據(jù),如隨機(jī)身份證號(hào) 隨機(jī)姓名 隨機(jī)編碼 隨機(jī)ID 等等...
再生成寫入數(shù)據(jù)的時(shí)候,就可以引用這個(gè)隨機(jī)工具模塊引用里面的方法取隨機(jī)值,以保證寫入數(shù)據(jù)的唯一性
例:
def random_vin():
"""
生成隨機(jī)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模塊引入并封裝可用工具
因?yàn)樽罱K要將內(nèi)容寫入,所以要使用pyMysql模塊,將組裝好的sql語句執(zhí)行寫入
需要封裝的內(nèi)容有 數(shù)據(jù)庫鏈接 獲取游標(biāo) 語句執(zhí)行方法 數(shù)據(jù)庫查詢方法 刪除語句方法
例:
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("數(shù)據(jù)庫執(zhí)行成功")
cur.close()
except Exception as e:
print(str(e))
print(sql)
# 有異常就回滾
conn.rollback()
# 關(guān)閉連接
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))
# 關(guān)閉連接
cur.close()
conn.close()
3)讀取配置的模塊
因?yàn)槲覀儗ql語句的頭通過配置文件進(jìn)行管理,那么就需要一個(gè)讀取配置的模塊或方法,因?yàn)槲冶容^菜 所以為了看起來更加清晰 就用模塊來進(jìn)行管理了
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) 編寫生成寫入信息的方法
因?yàn)槲覀冊(cè)谔幚砘A(chǔ)數(shù)據(jù)的時(shí)候就已經(jīng)寫好了sql寫入語句頭了,所以現(xiàn)在只要生成它后面的values值就可以了,這步就是生成他values值的步驟
創(chuàng)建一個(gè)列表,根據(jù)寫入語句內(nèi)字段的順序生成對(duì)應(yīng)字段的值并添加至創(chuàng)建的列表中。對(duì)應(yīng)字段的內(nèi)容如果是隨機(jī)值,就使用之前準(zhǔn)備好的隨機(jī)模塊,使用里面的方法生成隨機(jī)值;如果是需要從其他表中獲取的值,則通過封裝好的qymysql的查找方法進(jìn)行搜索并引用。
例:
def recycle_veh_scrap(prov, city):
"""
報(bào)廢車輛入庫表
:return:
"""
prov_info = random_util.random_city_code(prov, city)
# 獲取當(dāng)?shù)厮泄拘畔?
company = search_factory_info.get_company_data(prov, city)
# 獲取vin
vin = random_util.random_vin()
# 生成數(shù)據(jù)容器
insert_data = []
# 生成隨機(jī)zqy_id,寫入列表
insert_data.append(random_util.random_id())
# 生成隨機(jī)vin,寫入列表
insert_data.append(vin)
# 生成隨機(jī)電池包數(shù),寫入列表
insert_data.append(random.randint(1, 10))
# 生成報(bào)廢時(shí)間,寫入列表
insert_data.append(random_util.random_date())
# bat_is_scrap
insert_data.append('1')
# wmi
insert_data.append(vin[0:3].upper())
# 生成報(bào)廢企業(yè)名稱,寫入列表
insert_data.append(company[0])
# 生成報(bào)廢企業(yè)代碼,寫入列表
insert_data.append(company[1])
# 獲取省級(jí)代碼,寫入列表
insert_data.append(prov_info[0])
# 獲取市級(jí)代碼,寫入列表
insert_data.append(prov_info[1])
# 數(shù)據(jù)提交時(shí)間為當(dāng)前數(shù)據(jù)生成時(shí)間,寫入列表
insert_data.append(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))return insert_data
5) 編寫統(tǒng)計(jì)方法
因?yàn)槲覀儗懭氲闹凳请S機(jī)的,所以沒有標(biāo)準(zhǔn)去判斷最終系統(tǒng)寫入的內(nèi)容是否正確。
那就需要我們將需要對(duì)比的值取出保存并統(tǒng)計(jì),用于最后對(duì)照使用。
取值的過程會(huì)在語句寫入之前一步完成,現(xiàn)在要先準(zhǔn)備一個(gè)數(shù)據(jù)處理的模塊,以便對(duì)取出的至進(jìn)行統(tǒng)計(jì)。
可以先準(zhǔn)備幾個(gè)比較常用的,例如列表內(nèi)同類值 列表內(nèi)數(shù)值求和 字典合并等方法,如果后面再有更復(fù)雜的格式,再單獨(dú)編寫。
例:
def TongJiQi(list): # 列表內(nèi)容統(tǒng)計(jì)器,對(duì)列表內(nèi)的重復(fù)項(xiàng)進(jìn)行數(shù)量統(tǒng)計(jì) 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): """ 對(duì)列表內(nèi)的數(shù)值進(jìn)行求和 :param data_list: :return: """ total = 0 for ele in range(0, len(data_list)): total = total + data_list[ele] return total
以上,準(zhǔn)備工作就都做好了,下面就要開始真正的寫入了
4.3 生成數(shù)據(jù)并拼裝為sql語句
1) 通過生產(chǎn)sql語句數(shù)量來控制循環(huán),將sql頭與值拼裝在一起,并將拼裝好的結(jié)果進(jìn)行寫入
2) 在循環(huán)生成寫入值的過程中,將需要統(tǒng)計(jì)或計(jì)算的值取出單獨(dú)保存,在寫入結(jié)束后再進(jìn)行技術(shù)統(tǒng)計(jì)輸出統(tǒng)計(jì)結(jié)果
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)計(jì)計(jì)算的數(shù)據(jù)
company_num = []
des_company_num = []
while i < sql_num:
i += 1
# 取生成的values值
data = _crap_out(prov, city, des_prov, des_city)
# 收集需要統(tǒng)計(jì)的數(shù)據(jù)
company_num.append(data[8])
des_company_num.append(data[4])
# 拼裝sql語句
sql = sql + str(tuple(data)) + ','
# 最后一組數(shù)據(jù)后的,刪除掉
right_sql = sql.strip(',')
# 拼裝上結(jié)尾的; fullsql作為返回值
full_sql = right_sql + ';'
# print(full_sql)
# 執(zhí)行寫入
pymysql_util.execut_sql(full_sql)
print('上報(bào)企業(yè)統(tǒng)計(jì): ' + str(
statistics_util.TongJiQi(company_num)))
print('去向企業(yè)統(tǒng)計(jì): ' + str(
statistics_util.TongJiQi(des_company_num)))
這樣一個(gè)表的數(shù)據(jù)就寫入成功了,只需要調(diào)整寫入條數(shù)就可以想寫入多少條就寫入多少條,還可以直接輸出你關(guān)心的字段統(tǒng)計(jì)結(jié)果。
多個(gè)數(shù)據(jù)庫表的話可以就是將以上的生產(chǎn)數(shù)據(jù)和寫入數(shù)據(jù)的步驟復(fù)制,按照表名和字段稍作修改就可以了。
再將所有表的數(shù)據(jù)生成和寫入都編寫完成后,可以編寫一個(gè)小工具的入口,給自己編寫一個(gè)選擇器
每次只要輸入對(duì)應(yīng)的數(shù)字就可以執(zhí)行對(duì)應(yīng)的方法,寫入數(shù)據(jù)并輸出統(tǒng)計(jì)結(jié)果啦
def main(prov, city, sql_num, sour_prov, sour_city):
"""
啟動(dòng)數(shù)據(jù)自動(dòng)寫入的主方法
:return:
"""
features_type = input("請(qǐng)選擇生成數(shù)據(jù)所屬功能模塊 1.車輛報(bào)廢 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)
五.總結(jié)
以上只是一個(gè)工作過程中倉促搞出的一個(gè)小東西,還有很多不足。拋轉(zhuǎn)引玉,拿出來跟大家分享一下我的思路,希望能對(duì)大家有所幫助!
還有我趟過的坑,也記錄一下吧
1.不要只管悶頭寫,寫完一個(gè)表的時(shí)候就執(zhí)行試一下,不只要看數(shù)據(jù)庫寫進(jìn)去了 主要是看看要測(cè)試的平臺(tái)能不能看到,之前因?yàn)殚_發(fā)忘了跟我說一個(gè)字段條件,我全都寫完了也執(zhí)行成功了,但就是上不去平臺(tái),最后不得不大改一遍
2.隨時(shí)跟開發(fā)溝通確認(rèn)任何一個(gè)不確定的問題,因?yàn)橛械谋砜赡軙?huì)用不到,表內(nèi)的某些字段沒有用,表設(shè)計(jì)不明確的時(shí)候等等,這些時(shí)候都要跟他們確認(rèn)好再繼續(xù)動(dòng)手寫,防止無用功。
3.這只是輔助測(cè)試的工具,要控制住開發(fā)工具的時(shí)間,防止測(cè)試工作的延誤。
到此這篇關(guān)于詳解使用Python寫一個(gè)向數(shù)據(jù)庫填充數(shù)據(jù)的小工具(推薦)的文章就介紹到這了,更多相關(guān)Python向數(shù)據(jù)庫填充數(shù)據(jù)的小工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python操作MySQL數(shù)據(jù)庫9個(gè)實(shí)用實(shí)例
- python Django連接MySQL數(shù)據(jù)庫做增刪改查
- python連接oracle數(shù)據(jù)庫實(shí)例
- Python如何讀取MySQL數(shù)據(jù)庫表數(shù)據(jù)
- Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫詳解
- 跟老齊學(xué)Python之使用Python查詢更新數(shù)據(jù)庫
- Python操作MongoDB數(shù)據(jù)庫PyMongo庫使用方法
- Python MySQL數(shù)據(jù)庫連接池組件pymysqlpool詳解
- Python基于Pymssql模塊實(shí)現(xiàn)連接SQL Server數(shù)據(jù)庫的方法詳解
- python通用數(shù)據(jù)庫操作工具 pydbclib的使用簡(jiǎn)介
相關(guān)文章
python自動(dòng)化UI工具發(fā)送QQ消息的實(shí)例
今天小編就為大家分享一篇python自動(dòng)化UI工具發(fā)送QQ消息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python庫urllib與urllib2主要區(qū)別分析
這篇文章主要介紹了Python庫urllib與urllib2主要區(qū)別,需要的朋友可以參考下2014-07-07
利用Python實(shí)現(xiàn)網(wǎng)站自動(dòng)簽到
小五收藏了一些論壇網(wǎng)站,經(jīng)常需要自己登錄簽到,以此來獲得積分金幣等等。但天天手動(dòng)太容易忘了這件事啦。畢竟我們都會(huì)用python了,那就可以使用Selenium操作,接下來就和大家講講如何利用Python實(shí)現(xiàn)網(wǎng)站自動(dòng)簽到2022-08-08
Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享前篇
這篇文章主要為大家介紹了Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享前篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

