公有云执行脚本方式升级

1.界面化执行脚本优点

  • 传统执行脚本
    1.人为维护数据脚本和结构脚本时,由于多人共同在一个文件中维护,容易造成脚本缺失

    2.准确性低:每个迭代上新条目过多时,也会容易造成出的脚本得不到更好的验证
    3.对于多个租户的话,一些特殊化、基础脚本需要出N条,那麽人为去执行效率慢

  • 界面化执行脚本
    1.研发只需要按照一定的规则,将脚本使用git的方式放到代码中即可
    2.测试在测每个条目时,都会在界面操作一下数据和结构脚本,这样脚本会极大程度得到验证
    3.脚本不易丢失
    4.执行脚本效率高

2.设计

 首先需要设计两张表,数据脚本对应表+结构脚本对应表
 1.数据脚本对应表

在这里插入图片描述

 2.结构化脚本对应表

在这里插入图片描述

 对应代码获取可执行的脚本:
public List<Map<String,Object>> getDataSql(RootSqlDataVO dataVO) throws CrmMessageException {
		log.info("获取数据SQL开始");
		URL url = this.getClass().getClassLoader().getResource("sql-data");
		if(url == null) {
			return null;
		}
		File rootDir = new File(url.getPath());
		List<File> resultFiles = new ArrayList<File>();
		log.info("文件列表初始化");
		final String lastVersionBak = dataVO.getVersion();
		if(lastVersionBak == null || lastVersionBak.length() == 0) {
			log.info("lastversion为空:"+lastVersionBak);
			addFile(resultFiles,rootDir);
		}
		else {
			log.info("lastversion不为空:"+lastVersionBak);
			addFile(resultFiles,rootDir,new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					return lastVersionBak.compareTo(pathname.getName().substring(0,22)) < 0;
				}
			});
		}
		if(resultFiles.size() == 0) {
			throw new CrmMessageException("已经是最新版本,无需升级");
		}
		Collections.sort(resultFiles,new Comparator<File>(){

		@Override
		public int compare(File f1, File f2) {
			String fileTs1 = f1.getName().substring(0,22);
			String fileTs2 = f2.getName().substring(0,22);
			return fileTs1.compareTo(fileTs2);
		}
		
	});
	
	List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
	for(int i=0,len=resultFiles.size();i<len;i++) {
		Map<String,Object> item = new HashMap<String,Object>();
		String filePath = resultFiles.get(i).getAbsolutePath();
		filePath = "..." + filePath.substring(filePath.indexOf("classes")+"classes".length());
		item.put("name", filePath);
		
		result.add(item);
	}
	return result;
}

执行脚本:
@Transactional
public RootSqlDataVO dataSqlUp(Long id,String lastVersion) throws CrmMessageException {
	if(id == null) {
		//执行s下全部文件,并插入root_d
		Date time = new Date();
		//1、获取sql-struct下全部文件
		URL url = this.getClass().getClassLoader().getResource("sql-data");
		if(url == null) {
			return null;
		}
		File rootDir = new File(url.getPath());
		List<File> resultFiles = new ArrayList<File>();
		addFile(resultFiles,rootDir);
		Collections.sort(resultFiles,new Comparator<File>(){

			@Override
			public int compare(File f1, File f2) {
				String fileTs1 = f1.getName().substring(0,22);
				String fileTs2 = f2.getName().substring(0,22);
				return fileTs1.compareTo(fileTs2);
			}
			
		});
		//查询全部租户ID
		Map<String,Object> tenantParam = new HashMap<String,Object>();
		tenantParam.put("isInit", 2);
		List<SysTenantVO> tenantVOs = dao.selectVoList(SysTenantVO.class, "selectSysTenants",tenantParam);
		excuteFiles(tenantVOs,resultFiles);
		//获取版本号
		String version = resultFiles.get(resultFiles.size()-1).getName().substring(0,22);
		RootSqlDataVO dataVO = new RootSqlDataVO();
		dataVO.setLastModifyTime(time);
		dataVO.setTenantId(0L);
		dataVO.setVersion(version);
		//为已经初始化的租住生成租户脚本版本数据
		generateTeanantData(tenantVOs,dataVO);
		return dao.save(dataVO);
	}
	else {
		//执行lastModifyTime以后的全部脚本,并更新root_d
		Date time = new Date();
		//1、获取sql-struct下全部文件
		URL url = this.getClass().getClassLoader().getResource("sql-data");
		if(url == null) {
			return null;
		}
		File rootDir = new File(url.getPath());
		List<File> resultFiles = new ArrayList<File>();
		final String lastVersionBak = lastVersion;
		if(lastVersionBak == null || lastVersionBak.length() == 0) {
			log.info("lastversion为空:"+lastVersionBak);
			addFile(resultFiles,rootDir);
		}
		else {
			log.info("lastversion不为空:"+lastVersionBak);
			addFile(resultFiles,rootDir,new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					return lastVersionBak.compareTo(pathname.getName().substring(0,22)) < 0;
				}
			});
		}
		if(resultFiles.size() == 0) {
			throw new CrmMessageException("已经是最新版本,无需升级");
		}
		log.info("当前版本:"+ lastVersionBak);
		Collections.sort(resultFiles,new Comparator<File>(){

			@Override
			public int compare(File f1, File f2) {
				String fileTs1 = f1.getName().substring(0,22);
				String fileTs2 = f2.getName().substring(0,22);
				return fileTs1.compareTo(fileTs2);
			}
			
		});
		//查询全部租户ID
		Map<String,Object> tenantParam = new HashMap<String,Object>();
		tenantParam.put("isInit", 2);
		List<SysTenantVO> tenantVOs = dao.selectVoList(SysTenantVO.class, "selectSysTenants",tenantParam);
		excuteFiles(tenantVOs,resultFiles);
		//获取版本号
		String version = resultFiles.get(resultFiles.size()-1).getName().substring(0,22);
		RootSqlDataVO dataVO = new RootSqlDataVO();
		dataVO.setId(id);
		dataVO.setLastModifyTime(time);
		dataVO.setTenantId(0L);
		dataVO.setVersion(version);
		//批量更新查询到的租户的版本号
		Map<String,Object> sqlDataParam = new HashMap<String,Object>();
		sqlDataParam.put("version", version);
		sqlDataParam.put("lastModifyTime", time);
		List<Long> tenantIds = new ArrayList<Long>();
		for(int i=0,len=tenantVOs.size();i<len;i++) {
			tenantIds.add(tenantVOs.get(i).getId());
		}
		sqlDataParam.put("tenantIds", tenantIds);
		dao.updateSql(RootSqlDataVO.class, "updateByBatch",sqlDataParam);
		return super.updateVO(dataVO);
	}
}
脚本规范:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值