Sql-生成器,解决清洗数据痛点

2021-11-14  本文已影响0人  rrsunhome

Sql-生成器

背景

在工作当中,会遇到上线前需要初始化数据或上线后线上数据不正确、数据需要清洗等,对于复杂的场景需要写脚本来支持,对于简单的场景往往是写 sql 人工执行,数据的来源往往是某个文件,通过文件解析成对应的 sql,时间一长,每次发生这种事情就会产生不必要的工作量,所以本项目把解析、生产对应的 sql,抽象成对应工具库,提高开发效率

工作当中都有哪些痛点

  1. 线上数据不正确,需要更改成正确的
  2. 业务甩给开发一个文件,让线上的数据和文件中某些数据保持一致
  3. 上线前,需要初始化一批业务数据或需要修复一批数据,和本次上线的功能兼容

平常是如何解决的

写个 Sql 生成类,解析文件,生成 sql,这个过程会产生几个问题:

  1. 每次需要重新写代码,反复测试
  2. 耗费时间
  3. 代码得不到复用

本方案是如何解决的

抽象 Sq l 生成过程,其中为资源的加载、解析、数据格式化、展示,这几个部分可以独立扩展。

使用指南

Maven:

<dependency>
  <groupId>com.github.rrsunhome</groupId>
  <artifactId>excelsql-generate</artifactId>
  <version>2.1.0</version>
</dependency>

Builder API 使用

如果没有解析配置,以下几行代码就可以满足

        SqlGeneratorBuilder.newBuilder()
                .classPath("order-v1.xlsx") 
                .configureSqlFormatStrategy() // 配置 Sql 格式化策略
                .propertyPlaceholder() // 基于属性占位符格式化
                .propertyPlaceholderSql("insert into table(a,b,c) values({0},{1},{2});") // {cellIndex} cellIndex 为列下标
                .autoAddDoubleQuotes()  // 自动添加 ''
                .buildFormat()
                .build()
                .execute()// 执行
                .outputView(); // 输出到视图,默认控制台 

加载步骤:

  1. 资源路径 : classPath、本地 file
  2. 资源解析配置: 默认对数据不做任何处理,可以为
  3. 数据格式化策略: 基于属性占位符格式化,其中 { } 大括号中下标为纵坐标
  4. 数据输出结果:默认展示到控制台,可以扩展
  5. 具体构建过程可以参以下代码部分

Builder API 代码部分

public class SqlGeneratorBuilder {

    private Resource resource;

    private BaseParserConfig parserConfig;

    private FileParser fileParser;

    private RowFormatterStrategyBuilder outputSqlFormatBuilder;

    public static SqlGeneratorBuilder newBuilder() {
        return new SqlGeneratorBuilder();
    }

    public SqlGeneratorBuilder resource(Resource resource) {
        this.resource = resource;
        return this;
    }

    public SqlGeneratorBuilder filePath(String path) {
        this.resource = new FileSystemResource(path);
        return this;
    }

    public SqlGeneratorBuilder classPath(String path) {
        this.resource = new ClassPathResource(path);
        return this;
    }

    public SqlGeneratorBuilder parserConfig(BaseParserConfig parserConfig) {
        this.parserConfig = parserConfig;
        return this;
    }

    public SqlGeneratorBuilder resourceParser(FileParser fileParser) {
        this.fileParser = fileParser;
        return this;
    }

    public RowFormatterStrategyBuilder configureSqlFormatStrategy() {
        RowFormatterStrategyBuilder outputSqlFormatBuilder = new RowFormatterStrategyBuilder(this);
        this.outputSqlFormatBuilder = outputSqlFormatBuilder;
        return outputSqlFormatBuilder;
    }

    public SqlGenerator build() {
        String extension = resource.getExtension();
        if (fileParser == null) {
            fileParser = FileParserFactory.INSTANCE.findFileParser(extension);
        }
        if (fileParser == null) {
            throw new RuntimeException("Resource parser cannot be empty.");
        }
        if (parserConfig == null) {
            parserConfig = fileParser.getDefaultParserConfig();
        }

        if (!parserConfig.getClass().equals(fileParser.getDefaultParserConfig().getClass())) {
            throw new RuntimeException("Incorrect parser configuration type.");
        }
        return new DefaultSqlGenerator(resource, parserConfig, fileParser, outputSqlFormatBuilder.build());
    }


}

\

上一篇 下一篇

猜你喜欢

热点阅读