最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解使用Python寫一個向數(shù)據(jù)庫填充數(shù)據(jù)的小工具(推薦)

 更新時間:2020年09月11日 10:07:24   作者:硬核少女  
這篇文章主要介紹了用Python寫一個向數(shù)據(jù)庫填充數(shù)據(jù)的小工具,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一. 背景

公司又要做一個新項目,是一個合作型項目,我們公司出web展示服務(wù),合作伙伴線下提供展示數(shù)據(jù)。

而且本次項目是數(shù)據(jù)統(tǒng)計展示為主要功能,并沒有研發(fā)對應(yīng)的數(shù)據(jù)接入接口,所有展示數(shù)據(jù)源均來自數(shù)據(jù)庫查詢,

所以驗證數(shù)據(jù)沒有別的入口,只能通過在數(shù)據(jù)庫寫入數(shù)據(jù)來進行驗證。

二. 工具

Python+mysql

三.前期準備

前置:當然是要先準備好測試方案和測試用例,在準備好這些后才能目標明確將要開發(fā)自動化小工具都要有哪些功能,避免走彎路

3.1 跟開發(fā)溝通

1)確認數(shù)據(jù)庫連接方式,庫名 ;

2)測試所涉及到的表名;

3)每個表是對哪部分業(yè)務(wù)造成影響;

4)表之間的關(guān)聯(lián)關(guān)系,同業(yè)務(wù)模塊之間的不同表之間是否有關(guān)聯(lián)字段;

5)表中個字段數(shù)據(jù)是否有特殊來源,如用戶ID、廠商名稱一類與業(yè)務(wù)有一定關(guān)聯(lián)程度的字段,一定要確認好是可以隨機生成的 還是 需要從指定表中獲取字段

3.2 設(shè)計小工具最終要實現(xiàn)的效果

我設(shè)計這個小工具就希望它可以完成兩件事情

1) 生成sql語句,并且能寫入進入mysql數(shù)據(jù)庫

2) 數(shù)據(jù)我寫入sql的統(tǒng)計結(jié)果,方便使用它直接與頁面結(jié)果進行比對

3.3 給自己加個油! 我一定可以的!

四.開始編程

***因為代碼內(nèi)實際業(yè)務(wù)邏輯比較強,所以下面只寫出一些示例啦~

4.1 先處理一下基礎(chǔ)數(shù)據(jù)

1)因為我將要寫入的內(nèi)容涉及到全國的省市名稱和省市行政區(qū)域代碼,所以先找開發(fā)要了一個他們使用的全國省市名稱及代碼對照json,然后處理成字典格式備用

2)編寫寫入sql的語句頭

通過配置文件的方式將各個表的寫入語句的前半句語法格式和寫入字段名稱編輯好。

之后每次使用的時候只需通過配置文件讀取對應(yīng)表的寫入語句再拼裝上要寫入的內(nèi)容就是一個完整的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)編寫隨機工具

因為寫入的內(nèi)容大部分字段需要不重復(fù),所以使用random模塊,定義不同的方法生成各種類型隨機數(shù)據(jù),如隨機身份證號 隨機姓名 隨機編碼 隨機ID 等等...

再生成寫入數(shù)據(jù)的時候,就可以引用這個隨機工具模塊引用里面的方法取隨機值,以保證寫入數(shù)據(jù)的唯一性

例:

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模塊引入并封裝可用工具

因為最終要將內(nèi)容寫入,所以要使用pyMysql模塊,將組裝好的sql語句執(zhí)行寫入

需要封裝的內(nèi)容有 數(shù)據(jù)庫鏈接 獲取游標 語句執(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)讀取配置的模塊

因為我們將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) 編寫生成寫入信息的方法

因為我們在處理基礎(chǔ)數(shù)據(jù)的時候就已經(jīng)寫好了sql寫入語句頭了,所以現(xiàn)在只要生成它后面的values值就可以了,這步就是生成他values值的步驟

創(chuàng)建一個列表,根據(jù)寫入語句內(nèi)字段的順序生成對應(yīng)字段的值并添加至創(chuàng)建的列表中。對應(yīng)字段的內(nèi)容如果是隨機值,就使用之前準備好的隨機模塊,使用里面的方法生成隨機值;如果是需要從其他表中獲取的值,則通過封裝好的qymysql的查找方法進行搜索并引用。

例:

def recycle_veh_scrap(prov, city):
 """
 報廢車輛入庫表
 :return:
 """
 prov_info = random_util.random_city_code(prov, city)
 # 獲取當?shù)厮泄拘畔?
 company = search_factory_info.get_company_data(prov, city)
 # 獲取vin
 vin = random_util.random_vin()
 # 生成數(shù)據(jù)容器
 insert_data = []
 # 生成隨機zqy_id,寫入列表
 insert_data.append(random_util.random_id())
 # 生成隨機vin,寫入列表
 insert_data.append(vin)
 # 生成隨機電池包數(shù),寫入列表
 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])
 # 數(shù)據(jù)提交時間為當前數(shù)據(jù)生成時間,寫入列表
 insert_data.append(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))return insert_data

5) 編寫統(tǒng)計方法

因為我們寫入的值是隨機的,所以沒有標準去判斷最終系統(tǒng)寫入的內(nèi)容是否正確。

那就需要我們將需要對比的值取出保存并統(tǒng)計,用于最后對照使用。

取值的過程會在語句寫入之前一步完成,現(xiàn)在要先準備一個數(shù)據(jù)處理的模塊,以便對取出的至進行統(tǒng)計。

可以先準備幾個比較常用的,例如列表內(nèi)同類值 列表內(nèi)數(shù)值求和 字典合并等方法,如果后面再有更復(fù)雜的格式,再單獨編寫。

例:

def TongJiQi(list):
 # 列表內(nèi)容統(tǒng)計器,對列表內(nèi)的重復(fù)項進行數(shù)量統(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):
 """
 對列表內(nèi)的數(shù)值進行求和
 :param data_list:
 :return:
 """
 total = 0
 for ele in range(0, len(data_list)):
  total = total + data_list[ele]
 return total

以上,準備工作就都做好了,下面就要開始真正的寫入了

4.3 生成數(shù)據(jù)并拼裝為sql語句

1) 通過生產(chǎn)sql語句數(shù)量來控制循環(huán),將sql頭與值拼裝在一起,并將拼裝好的結(jié)果進行寫入

2) 在循環(huán)生成寫入值的過程中,將需要統(tǒng)計或計算的值取出單獨保存,在寫入結(jié)束后再進行技術(shù)統(tǒng)計輸出統(tǒng)計結(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)計計算的數(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)計的數(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('上報企業(yè)統(tǒng)計: ' + str(
 statistics_util.TongJiQi(company_num)))
print('去向企業(yè)統(tǒng)計: ' + str(
 statistics_util.TongJiQi(des_company_num)))

這樣一個表的數(shù)據(jù)就寫入成功了,只需要調(diào)整寫入條數(shù)就可以想寫入多少條就寫入多少條,還可以直接輸出你關(guān)心的字段統(tǒng)計結(jié)果。

多個數(shù)據(jù)庫表的話可以就是將以上的生產(chǎn)數(shù)據(jù)和寫入數(shù)據(jù)的步驟復(fù)制,按照表名和字段稍作修改就可以了。

再將所有表的數(shù)據(jù)生成和寫入都編寫完成后,可以編寫一個小工具的入口,給自己編寫一個選擇器

每次只要輸入對應(yīng)的數(shù)字就可以執(zhí)行對應(yīng)的方法,寫入數(shù)據(jù)并輸出統(tǒng)計結(jié)果啦

def main(prov, city, sql_num, sour_prov, sour_city):
 """
 啟動數(shù)據(jù)自動寫入的主方法
 :return:
 """
 features_type = input("請選擇生成數(shù)據(jù)所屬功能模塊 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)

五.總結(jié)

以上只是一個工作過程中倉促搞出的一個小東西,還有很多不足。拋轉(zhuǎn)引玉,拿出來跟大家分享一下我的思路,希望能對大家有所幫助!

還有我趟過的坑,也記錄一下吧

1.不要只管悶頭寫,寫完一個表的時候就執(zhí)行試一下,不只要看數(shù)據(jù)庫寫進去了 主要是看看要測試的平臺能不能看到,之前因為開發(fā)忘了跟我說一個字段條件,我全都寫完了也執(zhí)行成功了,但就是上不去平臺,最后不得不大改一遍

2.隨時跟開發(fā)溝通確認任何一個不確定的問題,因為有的表可能會用不到,表內(nèi)的某些字段沒有用,表設(shè)計不明確的時候等等,這些時候都要跟他們確認好再繼續(xù)動手寫,防止無用功。

3.這只是輔助測試的工具,要控制住開發(fā)工具的時間,防止測試工作的延誤。

到此這篇關(guān)于詳解使用Python寫一個向數(shù)據(jù)庫填充數(shù)據(jù)的小工具(推薦)的文章就介紹到這了,更多相關(guān)Python向數(shù)據(jù)庫填充數(shù)據(jù)的小工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python3+PyQt5實現(xiàn)拖放功能

    python3+PyQt5實現(xiàn)拖放功能

    這篇文章主要為大家詳細介紹了python3+PyQt5實現(xiàn)拖放功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • PyQt5基本控件使用之消息彈出、用戶輸入、文件對話框的使用方法

    PyQt5基本控件使用之消息彈出、用戶輸入、文件對話框的使用方法

    本文主要介紹PyQt界面實現(xiàn)中常用的消息彈出對話框、提供用戶輸入的輸入框、打開文件獲取文件/目錄路徑的文件對話框。 本文主要針對這三種控件的主要場景進行介紹。感興趣的朋友跟隨小編一起看看吧
    2019-08-08
  • Python asyncio的基本使用示例教程

    Python asyncio的基本使用示例教程

    Task主要作用是幫助event_loop調(diào)度,如果Task發(fā)現(xiàn)它打包的協(xié)程在await一個對象(執(zhí)行一個io操作),則Task會掛起該協(xié)程的執(zhí)行,把控制權(quán)交回event_loop,讓他去運行其他Task,當該對象運行完畢,Task將打包的協(xié)程恢復(fù)運行,本文介紹Python asyncio使用小結(jié),感興趣的朋友一起看看吧
    2024-02-02
  • 深入理解python虛擬機GIL詳解

    深入理解python虛擬機GIL詳解

    在目前的 CPython 當中一直有一個臭名昭著的問題就是 GIL (Global Interpreter Lock ),就是全局解釋器鎖,他限制了 Python 在多核架構(gòu)當中的性能,在本篇文章當中我們將詳細分析一下 GIL 的利弊和 GIL 的 C 的源代碼
    2023-10-10
  • python?selenium.webdriver?爬取政策文件的實現(xiàn)

    python?selenium.webdriver?爬取政策文件的實現(xiàn)

    本文主要介紹了python?selenium.webdriver?爬取政策文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    下面小編就為大家分享一篇詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解如何使用Python在PDF文檔中創(chuàng)建動作

    詳解如何使用Python在PDF文檔中創(chuàng)建動作

    PDF格式因其跨平臺兼容性和豐富的功能集而成為許多行業(yè)中的首選文件格式,其中,PDF中的動作(Action) 功能尤為突出,本文將介紹如何使用Python在PDF文檔中創(chuàng)建動作,需要的朋友可以參考下
    2024-09-09
  • Python操作遠程服務(wù)器 paramiko模塊詳細介紹

    Python操作遠程服務(wù)器 paramiko模塊詳細介紹

    這篇文章主要介紹了Python操作遠程服務(wù)器 paramiko模塊詳細介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python中zip()函數(shù)遍歷多個列表方法

    python中zip()函數(shù)遍歷多個列表方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python中zip()函數(shù)遍歷多個列表方法,對此有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • python?OpenCV圖像金字塔

    python?OpenCV圖像金字塔

    這篇文章主要介紹了python?OpenCV圖像金字塔,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06

最新評論

凌海市| 贞丰县| 平邑县| 黄山市| 奈曼旗| 平利县| 青川县| 尼木县| 阳新县| 丹东市| 衡阳县| 永泰县| 鹿邑县| 恩施市| 江城| 彭山县| 涿鹿县| 巴彦淖尔市| 阳高县| 武宣县| 普陀区| 盘山县| 无锡市| 莱西市| 云浮市| 旬邑县| 江达县| 巫溪县| 巴中市| 汝州市| 德钦县| 保亭| 高淳县| 类乌齐县| 将乐县| 海宁市| 洞口县| 贡觉县| 资溪县| 清水河县| 阳山县|