springboot集成flyway,數據庫是oracle


一. springboot2.x ,oracle 11,用flyway5.x的報錯,后來用了4.x的

  • 在dependencies加入了 oracle 和 flyway 的配置
<dependency>
       <groupId>com.oracle</groupId>
       <artifactId>ojdbc6</artifactId>
       <version>11.2.0</version>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>4.2.0</version>
</dependency>
  • 在plugins中加了 flyway 的配置
<plugin>
    <groupId>org.flywaydb</groupId>
     <artifactId>flyway-maven-plugin</artifactId>
</plugin>
  • 配置文件

查看了很多文檔,然后在application.properties寫了下面的配置

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@192.168.1.11:1521/orcl
spring.datasource.username=comm
spring.datasource.password=comm
# Whether to enable flyway.
spring.flyway.enabled=true 
spring.flyway.baseline-on-migrate=false
# The locations of migrations scripts.
spring.flyway.locations=classpath:db/migration
spring.flyway.clean-on-validation-error=false
  • 啟動類
@EnableTransactionManagement
public class MyApplication {
      
    private static Logger logger = LoggerFactory.getLogger(MyApplication.class);
    
    public static void main(String[] args) {
        try {
            SpringApplication springApplication = new SpringApplication(MyApplication.class);
            springApplication.run(args);
            logger.info("----------------------flyway started successfully-----------------------");
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

}

啟動之后報錯:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "COMM" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.

這是因為沒有初始化那個COMM的schema,然后我就把配置文件的

spring.flyway.baseline-on-migrate= false 改成了true

重新啟動就成功了。

二、查看schema_version表

我一直找不到,comm自動補全里有這張表,差點就瘋了,然后看到別人的博文里說: 

由於schema_version是記錄數據庫版本信息的,因此flyway對其做了保護策略,如果要查看這張表,則必須給表名加雙引號,如:select * from "schema_version"

我終於看到了希望 : ) 

能在表里看到一條初始化的數據。

三、在resource下新建了文件夾 db/migration

sql腳本命名規范:前輟(V/R)+版本號(小版本之間以.或_分隔)+雙下划線+描述.sql。

1. 我先放入了V1.0.0__init.sql 和 V2.0.0__init.sql,第一個是新建表test的,第二個是往test里面插入數據的,再次啟動報錯(test表不存在)了,那是因為schema_version表中初始化的那一條是1,然后就從V2執行了。

然后刪掉了version表中的第二條數據,將sql文件重新起了名字

 

 

V1.0.1__init.sql:
create table test
(
  id          varchar2(20) not null,
  name     VARCHAR2(20)
);
V1.
0.2__init.sql: insert into comm.test(id, name) values ('1','張三'); insert into comm.test(id, name) values ('2','李四');

執行成功,表也創建成功了,開心ing。

四、我現在不想每次增加sql都需要重新啟動

1. 新建flyway的執行類,我比參考文檔多了36行的(把上面version表還有test表都刪掉了,執行會報錯,沒有COMM的schema)

 1 package org.ssh.hip.flyway.controller;
 2 
 3 
 4 import java.util.HashMap;
 5 import java.util.Map;
 6 
 7 import javax.sql.DataSource;
 8 
 9 import org.flywaydb.core.Flyway;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.stereotype.Controller;
14 import org.springframework.web.bind.annotation.RequestMapping;
15 import org.springframework.web.bind.annotation.ResponseBody;
16 
17 
18 @Controller
19 @RequestMapping("/flyway")
20 public class FlywayConfig {
21 
22    @Autowired
23    private DataSource dataSource;
24 
25    private Logger logger = LoggerFactory.getLogger(this.getClass());
26 
27 
28    @RequestMapping(value = "/migrate")
29    @ResponseBody
30    public Map<String, String> migrate(){
31        Map<String, String> res = new HashMap<String, String>();
32        
33        Flyway flyway = new Flyway();
34 
35        try {
36            flyway.setBaselineOnMigrate(true);// 為了創建schema
37            flyway.setDataSource(dataSource);
38            // 設置flyway掃描sql升級腳本、java升級腳本的目錄路徑或包路徑(表示是src/main/resources/flyway下面,前綴默認為src/main/resources,因為這個路徑默認在classpath下面)
39            flyway.setLocations("db/migration");
40            // 設置sql腳本文件的編碼
41            flyway.setEncoding("UTF-8");
42            flyway.setOutOfOrder(true);
43 
44            flyway.migrate();
45 
46 //       } catch (FlywayException e) {
47        } catch (Exception e) {
48 
49            flyway.repair();
50 
51            logger.error("Flyway配置加載出錯",e);
52            res.put("code", "-1");
53            res.put("message", "Flyway配置加載出錯" + e.getMessage());
54        }
55        res.put("code", "0");
56        res.put("message","success");
57        return res;
58    }
59 }

 

2. 修改啟動類(將flyway配置從springboot排除,避免springboot自動配置)

 1 import org.slf4j.Logger;
 2 import org.slf4j.LoggerFactory;
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
 6 import org.springframework.transaction.annotation.EnableTransactionManagement;
 7 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 8 
 9 @EnableSwagger2
10 @SpringBootApplication(exclude = { FlywayAutoConfiguration.class })
11 @EnableTransactionManagement
12 public class MyApplication {
13       
14     private static Logger logger = LoggerFactory.getLogger(MyApplication.class);
15     
16     public static void main(String[] args) {
17         try {
18             SpringApplication springApplication = new SpringApplication(MyApplication.class);
19             springApplication.run(args);
20             logger.info("----------------------flyway started successfully-----------------------");
21         } catch (Exception e) {
22             logger.error(e.getMessage());
23         }
24     }
25 
26 }

然后歐了~~

五、 設置sql存放的多個路徑

項目上為了管理sql方便,需要存放在不同的文件夾下,然后flyway的location就要設置多個地址

           List<String> lists = new ArrayList<String>();
           lists.add("filesystem:E:/module/apache-tomcat-8.5.46/webapps/test2");
           lists.add("filesystem:E:/module/apache-tomcat-8.5.46/webapps/all");
           lists.add("db/migration");
           String[] locations = lists.toArray(new String[0]); // new String[0]就是起一個模板的作用
           
           // 設置flyway掃描sql升級腳本、java升級腳本的目錄路徑或包路徑(表示是src/main/resources/flyway下面,前綴默認為src/main/resources,因為這個路徑默認在classpath下面)
           flyway.setLocations(locations);//("db/migration");

其中不是src下的,只要在前面加上 【filesystem: 】默認的是【classpath: 】,locations中存放數組就行了。多個路徑之間沒有先后關系,是按照sql前面的V的順序來執行的,不知道內部會不會按順序來讀取查找V的下一個。

flyway的一些其他配置
flyway.baseline-description對執行遷移時基准版本的描述.
flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有元數據的表時,是否自動執行基准遷移,默認false.
flyway.baseline-version開始執行基准遷移時對現有的schema的版本打標簽,默認值為1.
flyway.check-location檢查遷移腳本的位置是否存在,默認false.
flyway.clean-on-validation-error當發現校驗錯誤時是否自動調用clean,默認false.
flyway.enabled是否開啟flywary,默認true.
flyway.encoding設置遷移時的編碼,默認UTF-8.
flyway.ignore-failed-future-migration當讀取元數據表時是否忽略錯誤的遷移,默認false.
flyway.init-sqls當初始化好連接時要執行的SQL.
flyway.locations遷移腳本的位置,默認db/migration.
flyway.out-of-order是否允許無序的遷移,默認false.
flyway.password目標數據庫的密碼.
flyway.placeholder-prefix設置每個placeholder的前綴,默認${.
flyway.placeholder-replacementplaceholders是否要被替換,默認true.
flyway.placeholder-suffix設置每個placeholder的后綴,默認}.
flyway.placeholders.[placeholder name]設置placeholder的value
flyway.schemas設定需要flywary遷移的schema,大小寫敏感,默認為連接默認的schema.
flyway.sql-migration-prefix遷移文件的前綴,默認為V.
flyway.sql-migration-separator遷移腳本的文件名分隔符,默認__
flyway.sql-migration-suffix遷移腳本的后綴,默認為.sql
flyway.tableflyway使用的元數據表名,默認為schema_version
flyway.target遷移時使用的目標版本,默認為latest version
flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主數據源
flyway.user遷移數據庫的用戶名
flyway.validate-on-migrate遷移時是否校驗,默認為true.
參考文檔:
1.flyway,maven,oracle集成記錄
https://blog.csdn.net/citeng1329/article/details/100288990
2.運用flyway實現數據庫版本自動更新控制實錄
https://blog.csdn.net/u014255803/article/details/79107708/
3.SpringBoot項目集成Flyway配置執行順序問題解決方法
https://blog.csdn.net/u012134942/article/details/97002288
4.為什么springboot會在啟動的時候自動運行Flyway DB? (這就是把上一個問題里面exclude的那個啟動類代碼貼出來了,直接ctrl鼠標左鍵點進去就可以看到)
https://www.jianshu.com/p/b05a36f91ebc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM