详解使用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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
php使用递归与迭代实现快速排序示例
Jan 23 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
Python实现识别手写数字大纲
Jan 29 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python控制台实现交互式环境执行
Jun 09 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 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笔记之:文章中图片处理的使用
2013/04/26 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php生成二维码
2015/08/10 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
IE 下的只读 innerHTML
2009/08/21 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python实现简单的代理服务器
2015/07/25 Python
python unittest实现api自动化测试
2018/04/04 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
运动会领导邀请函
2014/01/10 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
毕业生工作求职信
2014/06/30 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Ajax实现异步加载数据
2021/11/17 Javascript