详解使用Python写一个向数据库填充数据的小工具(推荐)


Posted in Python onSeptember 11, 2020

一. 背景

公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据。

而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库查询,

所以验证数据没有别的入口,只能通过在数据库写入数据来进行验证。

二. 工具

Python+mysql

三.前期准备

前置:当然是要先准备好测试方案和测试用例,在准备好这些后才能目标明确将要开发自动化小工具都要有哪些功能,避免走弯路

3.1 跟开发沟通

1)确认数据库连接方式,库名 ;

2)测试所涉及到的表名;

3)每个表是对哪部分业务造成影响;

4)表之间的关联关系,同业务模块之间的不同表之间是否有关联字段;

5)表中个字段数据是否有特殊来源,如用户ID、厂商名称一类与业务有一定关联程度的字段,一定要确认好是可以随机生成的 还是 需要从指定表中获取字段

3.2 设计小工具最终要实现的效果

我设计这个小工具就希望它可以完成两件事情

1) 生成sql语句,并且能写入进入mysql数据库

2) 数据我写入sql的统计结果,方便使用它直接与页面结果进行比对

3.3 给自己加个油! 我一定可以的!

四.开始编程

***因为代码内实际业务逻辑比较强,所以下面只写出一些示例啦~

4.1 先处理一下基础数据

1)因为我将要写入的内容涉及到全国的省市名称和省市行政区域代码,所以先找开发要了一个他们使用的全国省市名称及代码对照json,然后处理成字典格式备用

2)编写写入sql的语句头

通过配置文件的方式将各个表的写入语句的前半句语法格式和写入字段名称编辑好。

之后每次使用的时候只需通过配置文件读取对应表的写入语句再拼装上要写入的内容就是一个完整的sql语句了

使用配置文件的模式主要是可以统一管理,并且可以保持后面生成环节的代码整洁

[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语句执行写入

需要封装的内容有 数据库链接 获取游标 语句执行方法 数据库查询方法 删除语句方法

例:

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("数据库执行成功")
  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写入语句头了,所以现在只要生成它后面的values值就可以了,这步就是生成他values值的步骤

创建一个列表,根据写入语句内字段的顺序生成对应字段的值并添加至创建的列表中。对应字段的内容如果是随机值,就使用之前准备好的随机模块,使用里面的方法生成随机值;如果是需要从其他表中获取的值,则通过封装好的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())
 # 生成报废企业名称,写入列表
 insert_data.append(company[0])
 # 生成报废企业代码,写入列表
 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) 编写统计方法

因为我们写入的值是随机的,所以没有标准去判断最终系统写入的内容是否正确。

那就需要我们将需要对比的值取出保存并统计,用于最后对照使用。

取值的过程会在语句写入之前一步完成,现在要先准备一个数据处理的模块,以便对取出的至进行统计。

可以先准备几个比较常用的,例如列表内同类值 列表内数值求和 字典合并等方法,如果后面再有更复杂的格式,再单独编写。

例:

def TongJiQi(list):
 # 列表内容统计器,对列表内的重复项进行数量统计
 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语句数量来控制循环,将sql头与值拼装在一起,并将拼装好的结果进行写入

2) 在循环生成写入值的过程中,将需要统计或计算的值取出单独保存,在写入结束后再进行技术统计输出统计结果

def write_sql(prov, city, des_prov, des_city)
# 通过配置文件获取sql头
sql = config_util.get_config_data('veh_scrap', 'pack_out')
# 控制循环
i = 0
# 创建列表,用于收集需要统计计算的数据
company_num = []
des_company_num = []
while i < sql_num:
 i += 1
 # 取生成的values值
 data = _crap_out(prov, city, des_prov, des_city)
 # 收集需要统计的数据
 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)
# 执行写入
pymysql_util.execut_sql(full_sql)
print('上报企业统计: ' + str(
 statistics_util.TongJiQi(company_num)))
print('去向企业统计: ' + str(
 statistics_util.TongJiQi(des_company_num)))

这样一个表的数据就写入成功了,只需要调整写入条数就可以想写入多少条就写入多少条,还可以直接输出你关心的字段统计结果。

多个数据库表的话可以就是将以上的生产数据和写入数据的步骤复制,按照表名和字段稍作修改就可以了。

再将所有表的数据生成和写入都编写完成后,可以编写一个小工具的入口,给自己编写一个选择器

每次只要输入对应的数字就可以执行对应的方法,写入数据并输出统计结果啦

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.不要只管闷头写,写完一个表的时候就执行试一下,不只要看数据库写进去了 主要是看看要测试的平台能不能看到,之前因为开发忘了跟我说一个字段条件,我全都写完了也执行成功了,但就是上不去平台,最后不得不大改一遍

2.随时跟开发沟通确认任何一个不确定的问题,因为有的表可能会用不到,表内的某些字段没有用,表设计不明确的时候等等,这些时候都要跟他们确认好再继续动手写,防止无用功。

3.这只是辅助测试的工具,要控制住开发工具的时间,防止测试工作的延误。

到此这篇关于详解使用Python写一个向数据库填充数据的小工具(推荐)的文章就介绍到这了,更多相关Python向数据库填充数据的小工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中实现常量(Const)功能
Jan 28 Python
Python中的元类编程入门指引
Apr 15 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
如何更优雅地写python代码
Jul 02 Python
python实现图片九宫格分割
Mar 07 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
Django框架models使用group by详解
Mar 11 Python
django配置app中的静态文件步骤
Mar 27 Python
如何让python的运行速度得到提升
Jul 08 Python
如何利用python读取micaps文件详解
Oct 18 Python
python 提取html文本的方法
May 20 Python
python如何实现图片压缩
Sep 11 #Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 #Python
详解Python中import机制
Sep 11 #Python
python使用隐式循环快速求和的实现示例
Sep 11 #Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 #Python
降低python版本的操作方法
Sep 11 #Python
Django crontab定时任务模块操作方法解析
Sep 10 #Python
You might like
PHP与javascript的两种交互方式
2006/10/09 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
JS 建立对象的方法
2007/04/21 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
python 排序算法总结及实例详解
2016/09/28 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
python for循环remove同一个list过程解析
2019/08/14 Python
python实现大量图片重命名
2020/03/23 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
Python中生成ndarray实例讲解
2021/02/22 Python
煤矿班组长的职责
2013/12/25 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
党支部先进事迹材料
2014/12/24 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书