Flyway
1. Flyway是什么
Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。
2. 为什么要使用Flyway
在真实的项目开发中,我们每个人都会有一个应用软件和与其相联系的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我在我的本地有一套软件和相应的数据库系统,我的另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当中去。
我们现在需要在许多环境中COPY我们的环境,这会给我们的开发效率带来很大的麻烦。而Flyway可以非常容易的解决这些麻烦。
这里其实值得一提的是,用过Spring的小伙伴应该都知道Spring本身自己可以使用Hibernate自动更新数据库,只需要在配置文件中加入一条配置项即可:
spring.jpa.hibernate.ddl-auto=update
这个属性主要用于:自动创建|更新|验证数据库表结构,可以设定成Create|Create-drop|update|validate。
-
validate:加载hibernate时,验证创建数据库表结构
-
create:每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因
-
create-drop:加载hibernate时创建,退出时删除表结构
-
update: 加载hibernate自动更新数据库结构
对于Spring自动更新数据库,不透明,控制自由度不高,更重要的是跨平台和跨数据库时,没有Flyway的适应性好。
3. 如何使用Flyway
Flyway的运行机制很简单,其中Migrate是Flyway工作流的核心功能,主要目的就是把数据库Schema迁移到最新版本,Flyway每次在执行Migrate的时候会检测你的数据库中的flyway_schema_history表,如果它没有检测到,会自动创建一张新的flyway_schema_history表用于版本控制。当检测到你有新的版本需要迁移的时候,Flyway会逐一比对flyway_schema_history表中的已存在的版本记录,如果有未应用的Migrations,Flyway会获取这些Migrations并按次序Apply到数据库中,否则不需要做任何事情。另外,通常在应用程序启动时应默认执行Migrate操作,从而避免程序和数据库的不一致性。
更新flyway_schema_history中的版本记录用于以后的追踪。
以上步骤Flyway都会自动替我们完成,所以在实际使用中我们真正需要注意的就是如何按照Flyway的约定去完成Migrations。
Migrations一般就是普通的SQL脚本,但是在Flyway中我们的脚本名称需要有一定的命名规范才可以被Flyway识别和处理。下面是我从官方文档中找到的命名规则图。
首先我们需要一个大写的V作为版本的前缀标志,然后在后面紧跟着一个数字作为版本号,这个就是我之前提到的Flyway进行追踪的依据,在版本号后面需要下划线作为分隔符用来分割版本号和说明(这里特别需要注意的是分隔符是两个下划线)。
4. 集成Spring Boot
这里我说一下我的配置步骤。
首先需要在POM文件中加入:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.7</version>
</dependency>
Spring Boot 将会自动管理Flyway的启动和运行。
然后Flyway会默认在你的项目的CLASSPATH路径下的db/migration目录下(在我们的项目一般就是src/main/resources/db/migration里面)查找SQL脚本。将你的SQL脚本写完然后放入此路径下后就可以运行你的项目,Spring会自动创建Flyway的Bean来处理你的脚本。
这里需要注意的是,我在前面有提到过Spring自带的ddl-auto属性,由于我们已经使用Flyway来做数据库的版本控制了,所以在这里我们需要把此属性设置为none。