baomidou / dynamic-datasource

dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Apache License 2.0
4.67k stars 1.19k forks source link

h2执行单元测试,支持通配符扫描schema文件 #227

Closed superlyao closed 4 years ago

superlyao commented 4 years ago

Enviroment

JDK Version(required): 1.8

SpringBoot Version(required): 2.1.2.RELEASE

dynamic-datasource-spring-boot-starter Version(required):3.1.1

druid Version(optional):

Describe

项目在执行单元测试的时候,需要初始化多个schema,配置如下

          url: jdbc:h2:mem:h2/test
          username: sa
          password: 123456
          driver-class-name: org.h2.Driver
          schema: h2/schema/*.sql

以上的配置会下面的警告,导致单元测试执行失败:

[2020-06-09 18:26:33.939] [] [aic-generaldataquery-server] [] [] [WARN] [com.baomidou.dynamic.datasource.support.ScriptRunner] [67] - [could not find schema or data file h2/schema/*.sql]

查看源码发现,获取schema文件使用的ClassPathResource

// com.baomidou.dynamic.datasource.support.ScriptRunner
  public void runScript(DataSource dataSource, String location) {
    if (StringUtils.hasText(location)) {
      ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
      populator.setContinueOnError(continueOnError);
      populator.setSeparator(separator);
      if (location.startsWith("classpath:")) {
        location = location.substring(10);
      }
      ClassPathResource resource = new ClassPathResource(location);
      if (resource.exists()) {
        populator.addScript(resource);
        try {
          DatabasePopulatorUtils.execute(populator, dataSource);
        } catch (Exception e) {
          log.warn("execute sql error", e);
        }
      } else {
        log.warn("could not find schema or data file {}", location);
      }
    }
  }

Expected Result:

我对这个段代码本地改了一下,可以支持通配符扫描schema文件,改动如下

    public void runScript(DataSource dataSource, String location) {
        if (StringUtils.hasText(location)) {
            ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
            populator.setContinueOnError(continueOnError);
            populator.setSeparator(separator);
            try {
                ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
                populator.addScripts(resolver.getResources(location));
                DatabasePopulatorUtils.execute(populator, dataSource);
            } catch (DataAccessException e) {
                log.warn("execute sql error", e);
            } catch (Exception e1) {
                log.warn("failed to initialize dataSource from schema file {} ", location, e1);
            }
        }
    }

配置文件如下:

          url: jdbc:h2:mem:h2/test
          username: sa
          password: 123456
          driver-class-name: org.h2.Driver
          schema: classpath*:h2/schema/*.sql

以上配置,都已经通过本地打包测试

@huayanYu 如果觉得可行,我可以提一个PR

Actual Result:

Steps to reproduce

huayanYu commented 4 years ago

可行

huayanYu commented 4 years ago

merged