当前位置:   article > 正文

springboot集成flyway_spring.flyway.locations

spring.flyway.locations

问题抛出:

        Spring boot项目启动后没有该数据库则先创建数据库然后执行flyway脚本创建相应表数据,其中可能存在bean加载顺序问题,比如我的安全框架会先去加载我的resouece表,但是flyway在其后面执行,所以我们需要自定义bean加载顺序,即先创建数据库-》加载flyway配置-》其他调用表数据资源配置。

引入pom:

  1. <!--flywaydb-->
  2. <dependency>
  3. <groupId>org.flywaydb</groupId>
  4. <artifactId>flyway-core</artifactId>
  5. <version>5.2.4</version>
  6. </dependency>

application.yml

  1. spring:
  2. application:
  3. name: sims
  4. datasource:
  5. url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
  6. username: root
  7. password: root
  8. driver-class-name: com.mysql.cj.jdbc.Driver
  9. flyway:
  10. #开启
  11. enabled: true
  12. #当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
  13. baseline-on-migrate: true
  14. # 检测迁移脚本的路径是否存在,如不存在,则抛出异常
  15. check-location: true
  16. #sql脚本位置
  17. locations: classpath:db/migration
  18. #是否允许无序的迁移,默认false
  19. out-of-order: false
  20. #编码
  21. encoding: UTF-8
  22. # flyway.baseline-description对执行迁移时基准版本的描述.
  23. # flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
  24. # flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
  25. # flyway.check-location检查迁移脚本的位置是否存在,默认false.
  26. # flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
  27. # flyway.enabled是否开启flywary,默认true.
  28. # flyway.encoding设置迁移时的编码,默认UTF-8.
  29. # flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
  30. # flyway.init-sqls当初始化好连接时要执行的SQL.
  31. # flyway.locations迁移脚本的位置,默认db/migration.
  32. # flyway.out-of-order是否允许无序的迁移,默认false.
  33. # flyway.password目标数据库的密码.
  34. # flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
  35. # flyway.placeholder-replacementplaceholders是否要被替换,默认true.
  36. # flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
  37. # flyway.placeholders.[placeholder name]设置placeholder的value
  38. # flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
  39. # flyway.sql-migration-prefix迁移文件的前缀,默认为V.
  40. # flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
  41. # flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
  42. # flyway.tableflyway使用的元数据表名,默认为schema_version
  43. # flyway.target迁移时使用的目标版本,默认为latest version
  44. # flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
  45. # flyway.user迁移数据库的用户名
  46. # flyway.validate-on-migrate迁移时是否校验,默认为true.

创建脚本

 这里是我们要执行的脚本,命名要符合规范,开头V与R区别自己可以去flyway官网查看。

启动类去除spring管理flyway,我们自定义

  1. @SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
  2. @EnableTransactionManagement
  3. public class TestApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(TestApplication.class, args);
  6. }
  7. }

自动创建数据库

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import org.common.enums.SystemConstant;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.context.annotation.Primary;
  9. import javax.sql.DataSource;
  10. import java.sql.Connection;
  11. import java.sql.DriverManager;
  12. import java.sql.Statement;
  13. @Configuration
  14. @Primary //在同样的DataSource中,首先使用被标注的DataSource
  15. public class DataSourceConfig {
  16. private Logger log = LoggerFactory.getLogger(DataSourceConfig.class);
  17. @Value("${spring.datasource.url}")
  18. //jdbc:mysql://127.0.0.1:3306/insight?useUnicode=true&characterEncoding=utf8&failOverReadOnly=false&allowMultiQueries=true
  19. private String datasourceUrl;
  20. @Value("${spring.datasource.driver-class-name}")
  21. private String driverClassName;
  22. @Value("${spring.datasource.username}")
  23. private String username;
  24. @Value("${spring.datasource.password}")
  25. private String password;
  26. @Bean //声明其为Bean实例
  27. public DataSource dataSource(){
  28. DruidDataSource datasource = new DruidDataSource();
  29. datasource.setUrl(datasourceUrl);
  30. datasource.setUsername(username);
  31. datasource.setPassword(password);
  32. datasource.setDriverClassName(driverClassName);
  33. try {
  34. Class.forName(driverClassName);
  35. String url01 = datasourceUrl.substring(0,datasourceUrl.indexOf("?"));
  36. String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
  37. // 可以定义一个常量或者自行切割url01,切割时mysql8会存在一个时区设置问题
  38. // url02切割后应该形如:"jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC"的字符串
  39. String url02 = SystemConstant.MYSQL_CONNECTION;
  40. // 连接已经存在的数据库,如:mysql
  41. Connection connection = DriverManager.getConnection(url02, username, password);
  42. Statement statement = connection.createStatement();
  43. // 创建数据库
  44. statement.executeUpdate("create database if not exists `" + datasourceName + "` default character set utf8 COLLATE utf8_general_ci");
  45. statement.close();
  46. connection.close();
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. return datasource;
  51. }
  52. }

FlywayConfig

  1. import javax.annotation.PostConstruct;
  2. import javax.sql.DataSource;
  3. import org.flywaydb.core.Flyway;
  4. import org.flywaydb.core.api.FlywayException;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.context.annotation.Configuration;
  9. @Configuration
  10. public class FlywayConfig {
  11. @Autowired
  12. private DataSource dataSource;
  13. private Logger logger = LoggerFactory.getLogger(this.getClass());
  14. @PostConstruct
  15. public void migrate() {
  16. Flyway flyway = new Flyway();
  17. flyway.setDataSource(dataSource);
  18. // 设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径(表示是src/main/resources/flyway下面,前缀默认为src/main/resources,因为这个路径默认在classpath下面)
  19. flyway.setLocations("db/migration");
  20. // 设置sql脚本文件的编码
  21. flyway.setEncoding("UTF-8");
  22. flyway.setOutOfOrder(true);
  23. try {
  24. flyway.migrate();
  25. } catch (FlywayException e) {
  26. flyway.repair();
  27. logger.error("Flyway配置加载出错",e);
  28. }
  29. }
  30. }

MyWebMvcConfigurerAdapter

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.context.annotation.DependsOn;
  3. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  4. @Configuration
  5. @DependsOn("flywayConfig")
  6. public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/595590
推荐阅读
相关标签
  

闽ICP备14008679号