背景:服务请求一体化项目升级到V4的服务请求类型时,所有配置库数据迁移到各省的业务库中,虽然数据出现大量冗余,但是这是唯一能解决V4 大量服务请求类型不在同一张表中的骚操作了,防止查询服务请求类型时GG。但是唯一考虑不足的就是对于全网需求的码表数据脚本新增出现脚本编写困难,大量重复没有意义的工作,占据了开发人员的大把时间,同时,对DBA来说这也是个噩梦,但是没有办法,规定不改就是这样。
针对以上问题,为了释放开发劳动力的大把时间(懒) 小民构思出了以下的工具。
根据开发人员提供的脚本模板自动生成其他30+省的数据库脚本。
本工具的实现思路:
各省端脚本除了 省份编码不同外,还有就是抬头不同,抬头包含 数据库ip 数据库名称,联系人,电话,操作条数。我们可以将31个省的数据库IP 用户名 配置在数据库中,其他数据由用户在上传文件时提供。 后台首先查询抬头模板,替换掉用户提供的数据,再解析SQL模板,查询各省配置数据,遍历动态生成不同省的脚本文件。
数据库表涉及:
-- 抬头模板表
CREATE TABLE `t_head_templat` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PRK',
`template_code` varchar(32) DEFAULT NULL COMMENT '模板类型ID',
`template_rmk` varchar(32) DEFAULT NULL COMMENT '模板类型名称',
`template_value` varchar(2000) DEFAULT NULL COMMENT '模板内容',
`crtime` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
-- 省份数据库IP表
CREATE TABLE `t_provcode_ip` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PRK',
`provcode` varchar(32) DEFAULT NULL COMMENT '省份编码',
`provname` varchar(32) DEFAULT NULL COMMENT '省份名称',
`ip` varchar(32) DEFAULT NULL COMMENT 'ip',
`port` varchar(10) DEFAULT NULL COMMENT '端口',
`sql_name` varchar(20) DEFAULT NULL COMMENT '数据库名',
`user_name` varchar(20) DEFAULT NULL COMMENT '数据库用户名',
`crtime` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
1.文件上传
文件格式校验
必填参数校验
2.解析sql文件,存放于list中
3.查询省份IP及抬头模板
4.遍历省份数据库信息 组装抬头,将数据依次写入指定路径
5.所有省份数据进行压缩
6.提供下载数据页面
7.提供清楚指定用户数据接口
代码不提供了,没有多少技术含量,这里说下需要注意的细节:
1.使用IO的时候一定记得flush()
2.使用表单上传文件的时候带参数的操作 贴一部分吧
function submitFile() { var fileObj = document.getElementById("customFile").files[0]; // js 获取文件对象
var FileController = "uploadSql"; // 接收上传文件的后台地址 var userId = $('#userId').val();
var tel = $('#tel').val();
var totalId = $('#totalId').val();
var fileNameId = $('#fileNameId').val(); // FormData 对象
var form = new FormData(); form.append("file", fileObj); // 文件对象
form.append("userName", userId); // user
form.append("phone", tel); // phone
form.append("total", totalId); // 总数
form.append("fileName", fileNameId); // 文件名称 //参数校验
if(userId.trim() === "" || tel.trim() === "" || totalId.trim() === "" || fileNameId.trim() === ""){
layer.msg("以上参数均为必填参数,请正确输入", {icon: 6, time: 2000});
return;
}
if(fileObj){
if(fileObj.name.substring(fileObj.name.length-4) != ".txt"){
layer.msg("文件模板必须为txt类型", {icon: 6, time: 2000});
return;
}
}else{
layer.msg("请选择上传文件", {icon: 6, time: 2000});
return;
}
$.ajax({
type: "POST",
url: "uploadSql",
data: form,
processData: false,
contentType: false,
cache: false,//上传文件无需缓存
success: function (data) {
window.location.href = "downLoadSqlFiles";
}
});
}
3.写文件的路径,也是最坑的地方。这里一定要使用绝对路径,不能使用相对路径。
我的打的war包部署在Linux服务器上,开始是已相对路径写的,本地测试没有一点问题,但是上了环境后就出现了大问题
1.数据写的地方不对,数据写到Tomcat bin目录下了,一开始没有想到这个问题,一直百度都没有答案,后来 find / -name 翟育涛.zip 发现了数据存错位置了
2.解决方法,使用绝对路径,首先是绝对路径的获取,然后拼接文件要放的数据。
String path = null;
try {
path = ResourceUtils.getURL("classpath:").getPath()+"/static/sql/"+ MapUtils.getString(map,"userName");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Over 欢迎使用
操作手册:
重复脚本自动生成工具操作手册
--by 宅小涛
1.首先您应该准备您的脚本模板 以Insert脚本为例,需要注意以下几点:
1.文件应该是txt文件。
2.每条语句都应该是正确无误的可执行语句。
3.每条插入语句不要换行,按照中移规范编写。
4.脚本应以云南编写 即 provcode 应该为 00030016
5.脚本不要添加抬头。
正确脚本 eg:
2.根据页面要求,您必须输入以下内容:
1.联系人、电话:根据中移数据脚本规范要,脚本内部抬头的注释里面需要添加联系人和电话;
2.操作数量:抬头中填写的操作的数据量,如果已知请填写具体数字,该字段同样是必填,可以填写未知
3.文件名称:生成的脚本的名称,因为生成的脚本是31个省+2个二线机构+重客的脚本,因此名称需要加以区分
例如需要生成的脚本的命名如下:
则这里需要填写的文件名称为:
洛阳-服务请求-生产-@@-ngwf-20190314-2-2-insert-sql
注意:1.文件名称不要加后缀;2.@@必须存在,脚本会被覆盖。3.不要添加脚本顶的注释,注释会自动生成。