flyway的使用


1、使用它之前先要了解一些概念:

版本:對數據庫的每一次變更可稱為一個版本。

遷移:Flyway把數據庫結構從一個版本更新到另一個版本叫做遷移。

可用的遷移:Flyway的文件系統識別出來的遷移版本。

已經應用的遷移:Flyway已經對數據庫執行過的遷移。

2、flyway最基本的幾個命令。

Migrate:應用所有的遷移到最新版本,它會在你的DB中新建個表schema_version來存放每次升級的版本信息。

Clean:clean all objects

Info:打印所有的遷移的信息以及狀態。

Validate:遷移之前進行驗證。

Baseline:初始化schema_version表,並插入一條原始verion=1。

Repair:它主要做了兩件事,移除所有失敗的遷移(升級),重置校驗和。

3、既支持sql方式升級也支持java方式升級

     1、持SQL(還有PL/SQL,T-SQL)文件的方式進行升級(這就是最原始的方式,但是得按照一定的規則規則,例如: V1_0_1__create.sql。

sql腳本的命名規則:

prefix: default:V (大寫) 

version: 版本號也可以使用大小版本組合的方式,小版本號用單 _區分  

separator: 分隔符,雙下划線 __  

description: 描述(必須要有意義)  

suffix: 后綴 default:  .sql

     2、當然也支持Java方式,繼承 JdbcMigration即可。

4、可以使用命令行客戶端command-lineclient來執行命令來升級數據庫的版本。這個在這就不介紹了,以后會拓展。重點在介紹java的使用。

5、當然flyway也提供了插件支持.

有如下插件支持:Maven, Gradle,SBT和Ant,還有更多Plugins,提供對Spring Boot, Dropwizard, Grails, Play,Griffon, Grunt, Ninja 的支持。其中可以研究下flyway-test-extensions,有Usage flyway dbunit test、Usage-flyway-spring-test 功能很強大。

6、在maven項目里面的spring mvc里面使用flyway在系統啟動的時候去檢查並升級數據庫的版本。

6.1、引入flyway的jar包,在pom.xml里面內容如下:

<!-- flyway依賴 -->

        <dependency>

          <groupId>org.flywaydb</groupId>

          <artifactId>flyway-core</artifactId>

          <version>3.0</version>

      </dependency>

 

6.2、編寫數據庫的版本的腳本文件,放到src/main/resources的flyway里面:

(flyway找腳本的時候默認去src/mian/resources下面的db/migration,如果要放

在別的位置,后面的地方要配置一下)

 


6.3、定義在應用啟動時自動運行Flyway的Java 類,並實現其邏輯代碼

package com.ibm.flyway;

importjavax.sql.DataSource;

importorg.flywaydb.core.Flyway;

import org.flywaydb.core.api.FlywayException;

public classFlywayMigration {

    private DataSource dataSource; 

    public void setDataSource(DataSourcedataSource) { 

        this.dataSource = dataSource; 

    } 

    public void migrate() { 

        Flyway flyway = new Flyway(); 

        flyway.setDataSource(dataSource);

       flyway.setLocations("db/migration"); // 設置flyway掃描sql升級腳本、java升級腳本的目錄路徑或包路徑(表示是src/main/resources/flyway下面,前綴默認為src/main/resources,因為這個路徑默認在classpath下面)

       flyway.setEncoding("UTF-8");  // 設置sql腳本文件的編碼

        flyway.setOutOfOrder(true);

        //flyway.setDataSource(dataSource); 

       //flyway.setSchemas("flywaydemo"); // 設置接受flyway進行版本管理的多個數據庫 

        //flyway.setTable("schema_version"); // 設置存放flyway metadata數據的表名 

       //flyway.setValidationMode(ValidationMode.ALL); // 設置執行migrate操作之前的validation行為 

       //flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 設置當validation失敗時的系統行為 

        // 設置當validation失敗時的系統行為

    try {

        flyway.setInitOnMigrate(true);

        flyway.migrate();

     } catch (FlywayException e) {

        flyway.repair();

        e.printStackTrace();

     }

    } 

}

6.4、設置在系統啟動是自動運行FlywayMigration類的migrate方法

在ApplicationContext.xml(spring mvc的上下文中加入如下:)

<!-- flayway-->

<beanid="flywayMigration1" class="com.ibm.flyway.FlywayMigration" init-method="migrate">

    <property name="dataSource"ref="dataSource" />

</bean>

從上面的bean 定義中我們可以看到,我們為flywayMigration 這個bean 實例注入了一個數據源,Flyway 的所有操作將針對這個數據源進行;同時我們通過init-method 屬性指定了Spring 在實例化該bean 以后,主動執行該bean 的migrate 方法,而該方法內會執行Flyway 更新數據庫的操作。

至此,我們達到了在應用啟動時,Spring 實例化上下文的時候,在Spring 實例化flywayMigration 這個bean 的時候,自動執行Flyway 更新數據庫的操作。

但是,我們還沒有達到目的,萬一Flyway 還在更新數據庫,沒有完成更新操作之前,應用程序的其他邏輯已經開始使用數據庫進行其他操作了,會導致應用程序產生很多bug ,甚至根本運行不起來。

要解決這個問題,我們可以利用Spring 的bean 依賴原理,讓關鍵的數據庫操作bean 依賴於flywayMigration 這個bean ,達到在flywayMigration 沒有實例化完成(數據庫更新操作完成)之前,不能進行任何其他數據庫相關操作。

利用Spring 的bean 依賴讓flywayMigration 優先處理數據庫更新操作:

<!-- 將連接池注入到 JdbcTemplate對象 -->

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"depends-on="flywayMigration1">

    <property name="dataSource"ref="dataSource"></property>

</bean>

至此,運行就可以了。

但是值得注意的是:

 在啟動的tomcat的時候,內容如下:

 

但是在schema_version里面已經執行過的版本號如下:

 

如果存在V1_0_0__create.sql這個腳本時,是不會執行這個的,而是會執行V1_0_1__create.sql,因為schema_version表的version為1其實被flyway默認為v1_0_0_0版本了,所以沒有執行。原因是schema_version表的version為1其實被flyway默認為v1_0_0版本了,所以沒有執行,而version版本為表示初始化schema_version。也就是說版本號只要不一樣就會執行。

注意:sql腳本的命名規則一定要准確,按照格式去命名。

 


免責聲明!

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



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