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

一. 背景

公司又要做一个新项目,是一个合作型项目,我们公司出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向数据库填充数据的小工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python基于滑动平均思想实现缺失数据填充的方法

    在时序数据处理过程中,我们经常会遇到由于现实中的种种原因导致获取的数据缺失的情况,这里的数据缺失不单单是指为'NaN'的数据,比如在AQI数据中,0是不可能出现的,这时候如果数据中出现了0也就是数据缺失了,最近正好在拿一个污染物的数据在做模型分析,中间就遇到了数据缺失值的问题,数据量本身不大,如果直接对缺失值进行丢弃处理的话会进一步减小数据量,所以这里考虑采用数据填充的方法来实现缺失数据的填充.我做了两个版本其中,第一个版本很简单可以不看,主要是简单实现以下效果.具体实现如下: #!usr/bi

  • Python Pandas实现数据分组求平均值并填充nan的示例

    Python实现按某一列关键字分组,并计算各列的平均值,并用该值填充该分类该列的nan值. DataFrame数据格式 fillna方式实现 groupby方式实现 DataFrame数据格式 以下是数据存储形式: fillna方式实现 1.按照industryName1列,筛选出业绩 2.筛选出相同行业的Series 3.计算平均值mean,采用fillna函数填充 4.append到新DataFrame中 5.循环遍历行业名称,完成2,3,4步骤 factordatafillna = pd.

  • python实现数据预处理之填充缺失值的示例

    1.给定一个数据集noise-data-1.txt,该数据集中保护大量的缺失值(空格.不完整值等).利用"全局常量"."均值或者中位数"来填充缺失值. noise-data-1.txt: 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0.2 5 3.6 1.4 0.2 5.4 3.9 1.7 0.4 4.6 3.4 1.4 0.3 5 3.4 1.5 0.2 4.4 2.9 1.4 0.2 4.9

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

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库查询, 所以验证数据没有别的入口,只能通过在数据库写入数据来进行验证. 二. 工具 Python+mysql 三.前期准备 前置:当然是要先准备好测试方案和测试用例,在准备好这些后才能目标明确将要开发自动化小工具都要有哪些功能,避免走弯路 3.1 跟开发沟通 1)确认数据库连接方式,库名 : 2)测

  • 详解用python写一个抽奖程序

    第一次使用python写程序,确实比C/C++之类方便许多.既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁.清晰.方便. 1.用到的模块 生成随机数的模块random 用来读取excel表格的模块xlrd 2.思路:首先打开excel表格,然后读取其中某个单元格或者某行或某列的元素,进行输出或存储. 3.如何保证随机:随机的关键在于取随机数.每抽一个人之前,我们随机生成一个随机数i,i代表了读取第i个人的数据,由于i的生成是完全随机的,所以也就保证了选取的人员是完全随

  • 万字详解JavaScript手写一个Promise

    目录 前言 Promise核心原理实现 Promise的使用分析 MyPromise的实现 在Promise中加入异步操作 实现then方法的多次调用 实现then的链式调用 then方法链式调用识别Promise对象自返回 捕获错误及 then 链式调用其他状态代码补充 捕获执行器错误 捕获then中的报错 错误与异步状态的链式调用 将then方法的参数变成可选参数 Promise.all方法的实现 Promise.resolve方法的实现 finally方法的实现 catch方法的实现 完整

  • 详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析json代码 单独编写了字符优化函数,解决微博评论中的嘈杂干扰字符 本函数是用python写网络爬虫的终极目的,所以采用函数化方式编写,方便后期优化和添加各种功能 # -*- coding:gbk -*- import re import requests import json from lxml im

  • 详解用Kotlin写一个基于Spring Boot的RESTful服务

    Spring太复杂了,配置这个东西简直就是浪费生命.尤其在没有什么并发压力,随便搞一个RESTful服务,让整个业务跑起来先的情况下,更是么有必要纠结在一堆的XML配置上.显然这么想的人是很多的,于是就有了Spring Boot.又由于Java 8太墨迹于是有了Kotlin. 数据源使用MySql.通过Spring Boot这个基本不怎么配置的,不怎么微的微框架的Spring Data JPA和Hibernate来访问数据. 处理依赖 这里使用Gradle来处理依赖. 首先下载官网给的初始项目:

  • 详解JavaScript中if语句优化和部分语法糖小技巧推荐

    目录 前言 if else 基本使用 简化if判断和优化代码 单行if else 使用&& || 优化 使用三目运算符优化 合并if 使用includes 或者indexof 使用switch流程 优化 多个if else 使用对象 key-value 优化多条if语句 使用map 推荐一些常用的JavaScript语法糖 箭头函数 三目运算符处理函数 函数默认参数处理 数据类型转换 Null.Undefined 布尔值等特殊值处理,使用||结合! 链判断运算符 链判断运算符 空值合并操作

  • 详解appium+python 启动一个app步骤

    询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动APP?1.获取包名:2.获取launcherActivity.获取这两个关键东西的方法很多,推荐使用sdk自带的aapt:aapt即Android Asset Packaging Tool,在SDK的build-tools目录下.该工具可以查看apk包名和launcherActivity,当然还有更多的功能,有兴趣的可以查看相关资料. 一.下载aapt:

  • 详解用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一个本地局域网.跟同事测试时,速度轻松达到800mb/s. 搭建只需三步就可以: 1.设置python路径为环境变量 2.命令行输入python -m http.server 8888来搭建局域网 3.使用本机的ip地址进行访问 接下来我们一步一步看: 设置python路径为环境变量 1.先找到自己p

  • 详解在Python中使用Torchmoji将文本转换为表情符号

    很难找到关于如何使用Python使用DeepMoji的教程.我已经尝试了几次,后来又出现了几次错误,于是决定使用替代版本:torchMoji. TorchMoji是DeepMoji的pyTorch实现,可以在这里找到:https://github.com/huggingface/torchMoji 事实上,我还没有找到一个关于如何将文本转换为表情符号的教程.如果你也没找到,那么本文就是一个了. 安装 这些代码并不完全是我的写的,源代码可以在这个链接上找到. pip3 install torch=

  • 详解JAVA生成将图片存入数据库的sql语句实现方法

    详解JAVA生成将图片存入数据库的sql语句实现方法 实现代码: 注释很清楚,不在重述~ public class Image2Hex { public static void main(String[] args) { try{ //存放图片的文件夹 File list = new File("d:/qmx"); File[] lists = list.listFiles(); String name; //生成的语句存放文件 PrintWriter pw = new PrintWr

随机推荐