Flyway, 資料庫Schema管理利器

黃博文發表於2015-04-09

整天跟資料庫打交道的程式設計師都知道,當資料庫的Schema發生改變時是多麼痛苦的事情。尤其是一個在不斷開發完善的專案,隨著需求變化,資料庫的schema也會跟著變化,而追蹤記錄這些變化一向都是費時費力。如果你擁有多個測試環境,那麼保證這些環境下的資料庫的一致性的難度會成倍增加。

Flyway,一款小工具,應用它能夠大大簡化這方面的工作。

它的優點:

  1. convention over configuration,配置簡單,使用方便;支援Sql及Java配置;

  2. 支援當前幾乎所有的主流資料庫;

  3. 擁有命令列工具、Maven、Gradle外掛….應用場景廣泛。

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

  • 版本:對資料庫的每一次變更可稱為一個版本。

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

  • 可用的遷移:Flyway的檔案系統識別出來的遷移版本。

  • 已經應用的遷移:Flyway已經對資料庫執行過的遷移。

如何使用:

以Sql配置舉例,建立一個資料夾用來存放所有資料庫修改記錄。

每次修改以’V版本號__描述.sql’的方式命名。比如V1__initial_version.sql, V2.1__create_table.sql,V2015.01.05__drop_view.sql

Flyway, 資料庫Schema管理利器

Flyway會根據檔名自動識別版本順序,並根據這些版本順序來應用資料庫修改。

配置

以使用Flyway的命令列工具為例。安裝命令列工具後,執行時Flyway會根據以下路徑來尋找配置檔案。

  • 安裝目錄/conf/flyway.properties

  • 使用者目錄/flyway.properties

  • 當前目錄/flyway.properties

或者直接在命令列使用 -configFile=myfile.properties來指定檔案。

配置檔案的一個示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
flyway.driver=org.hsqldb.jdbcDriver
flyway.url=jdbc:hsqldb:file:/db/flyway_sample
flyway.user=SA
flyway.password=mySecretPwd
flyway.schemas=schema1,schema2,schema3
flyway.table=schema_history
flyway.locations=classpath:com.mycomp.migration,database/migrations,filesystem:/sql-migrations
flyway.sqlMigrationPrefix=Migration-
flyway.sqlMigrationSeparator=__
flyway.sqlMigrationSuffix=-OK.sql
flyway.encoding=ISO-8859-1
flyway.placeholderReplacement=true
flyway.placeholders.aplaceholder=value
flyway.placeholders.otherplaceholder=value123
flyway.placeholderPrefix=#[
flyway.placeholderSuffix=]
flyway.resolvers=com.mycomp.project.CustomResolver,com.mycomp.project.AnotherResolver
flyway.callbacks=com.mycomp.project.CustomCallback,com.mycomp.project.AnotherCallback
flyway.target=5.1
flyway.outOfOrder=false
flyway.validateOnMigrate=true
flyway.cleanOnValidationError=false
flyway.baselineOnMigrate=false

命令列工具的幾個命令:

  • Clean: 刪除所有建立的資料庫物件,包括使用者、表、檢視等。

  • Migrate: 對資料庫依次應用版本更改。

  • Info:獲取目前資料庫的狀態。那些遷移已經完成,那些遷移待完成。所有遷移的執行時間以及結果。

  • Validate:驗證資料庫結構與遷移指令碼的異同。

  • Baseline:根據現有的資料庫結構生成一個基準遷移指令碼。

進階

flyway提供sql配置和Java配置兩種方式。sql配置可以方便實現對DDL的修改、一些引用資料的修改;而Java的方式則更強大些,可以應用更為複雜的場景,比如對某個資料表中的資料進行一些邏輯處理。具體使用請參見官方文件:(http://flywaydb.org/documentation/migration/java.html)http://flywaydb.org/documentation/migration/java.html

熟悉Ruby On Rails的程式設計師都知道Ruby On Rails自帶一個資料庫遷移工具,這個和那個差不多,可以說下JVM平臺的資料庫遷移工具,彌補了JVM平臺下維護資料庫Schema的不足。

相關文章