首先把官方的特性贴出来, 简明意概:
Flyway 的特性
* 自动升级(自动发现更新项):Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行,可以通过Ant 脚本执行,通过Maven 脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如在应用启动时执行)。
* 规约优于配置:Flyway 有一套默认的规约,所以不需要修改任何配置就可以正常使用。
* 既支持SQL 脚本,又支持Java 代码:可以使用SQL 脚本执行数据库更新,也可以使用Java 代码来进行一些高级数据升级操作。
* 高可靠性:在集群环境下进行数据库升级是安全可靠的。
* 支持清除已存在的库表结构:Flyway 可以清除已存在的库表结构,可以从零开始搭建您的库表结构,并管理您的数据库版本升级工作。
* 支持失败修复。新的2.0 版本提供了repair 功能,用于解决数据库更新操作失败问题
简单说, 上面的特性不难理解,flyway 是通过版本号来控制自动升级的功能,通过约定来默认实现配置,通过SQL 脚本实现数据库更新控制。SQ脚本和JAVA代码本身不和平台有关,故可实现高可用。通过约定的版本号控制SQL脚本的执行,则可以清除已存在的库表结构。
我个人比较倾向不和JAVA相关联,将Flyway 视为一种运维的工具, 故更推荐使用SQL脚本。
以下是官方的目录结构:
比较清晰,只要对应申明 目录结构即可。不一定要放在 migration 下面。
我个人常用gradle 做打包和集成工具,故这里写一下简单的flyway在gradle 中的应用方式。
首先在build.gradle中,引入flyway 插件(插件开发比较容易,会一点groovy 就行了。这里具体不展开)
官方引入方式:
plugins { id "org.flywaydb.flyway" version "4.0"}
我比较常用的引入方式:
apply plugin: 'org.flywaydb.flyway' //配置插件仓库 buildscript { repositories { mavenCentral() } dependencies { classpath "org.flywaydb:flyway-gradle-plugin:3.2.1" } }
随后就是在build.gradle里面声明 flyway 参数了
ext{ def prop = new Properties(); file(" src/main/resources/jdbc -mysql.properties").withInputStream { prop.load(it) } prop.each { project.extensions.add("$it.key",it.value); } } flyway { user = project['jdbc.user'] url= project['jdbc.url'] password = project['jdbc.pass'] locations=["filesystem:db/migration"] }
比较倾向以上的读取方式,使用单独的 配置文件,管理数据库的配置。
最后整理一下SQL的命名方式即可:
1。版本集成:
前缀用V,随后跟随 版本号, 版本号之间用 单一下划线表示。 后面跟随2个下划线,后面跟随具体的描述。最后是后缀
2。可重复的集成 :
前缀用R,随后跟随2个下划线,后面跟随具体的描述,最后是后缀
注意起步的版本号是 从1_0_0 开始的,故SQL脚本编码可以写1_0_1开始。
最后就是执行了,
首先执行 flywayBaseline 在数据库中建立 schema_version表,建立基础的版本信息,随后 执行 flywayMigrate 进行数据库脚本执行。
贴一下具体的tasks:
flywayMigrate:应用所有的迁移到最新版本,它会在你的DB中新建个表schema_version
来存放每次升级的版本信息。
flywayClean:clean all objects
flywayInfo:打印所有的迁移的信息以及状态。
flywayValidate:迁移之前进行验证。
flywayBaseline:初始化schema_version
表,并插入一条原始verion=1。
flywayRepair:它主要做了两件事,移除所有失败的迁移(升级),重置校验和。
第一个OSChina 的文章写完了,没有花多少时间, 但觉得还是挺满足的。