运用flyway实现数据库版本自动更新控制实录

运用flyway实现数据库版本自动更新控制实录

摘要

  • flyway版本说明
  • 命令行模式调用flyway
  • Java API模式调用flyway
  • spring配置实现项目启动自动更新数据库

一 测试环境

  • 操作系统:64位win7旗舰版SP1
  • 数据库:Oracle11.2.0.1.0
  • jdk版本:jdk7u21
  • maven项目
  • flyway版本:flyway4.2.0

二 flyway版本说明和下载地址

1 flyway官网:https://flywaydb.org/

2 版本说明:5.0以后版本需要jdk8/9的支持。我们需要使用4.2或以前的版本。

如果使用的jdk版本太低,会出现如下错误:
Unsupported major.minor version 52.0
52代表至少需要jdk1.8才能运行;各版本jdk对应的version如下:
jdk1.8  52
jdk1.7  51
jdk1.6  50
jdk1.5  49
jdk1.4  48
jdk1.3  47
jdk1.2  46
jdk1.1  45

3 flyway历史版本下载地址:https://repo1.maven.org/maven2/org/flywaydb/

4 官方教程:https://flywaydb.org/getstarted/

三 使用命令行模式更新数据库

1 下载命令行工具并解压:

https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/4.2.0/
运用flyway实现数据库版本自动更新控制实录_第1张图片
可以看到官方没有提供32位的工具包,意味着32位系统无法使用命令行模式

2 将Oracle数据库连接驱动复制到drivers目录下

运用flyway实现数据库版本自动更新控制实录_第2张图片

3 修改配置文件conf\flyway.conf中的数据库连接信息

运用flyway实现数据库版本自动更新控制实录_第3张图片

4 在sql目录下创建更新脚本

sql脚本命名规范:前辍(V/R)+版本号(小版本之间以.或_分隔)+双下划线+描述.sql。

如:V1_1__Create_version_table_comment.sql。创建1.1版本,为版本记录表添加中文注释

脚本内容:

comment on table "schema_version" is '数据库版本更新记录表';
comment on column "schema_version"."installed_rank" is '数据库版本记录主键';
comment on column "schema_version"."version" is '版本号';
comment on column "schema_version"."description" is '版本描述';
comment on column "schema_version"."type" is '更新脚本类型';
comment on column "schema_version"."script" is '更新脚本名称';
comment on column "schema_version"."checksum" is '校验码';
comment on column "schema_version"."installed_by" is '更新人';
comment on column "schema_version"."installed_on" is '更新时间';
comment on column "schema_version"."execution_time" is '执行时间';
comment on column "schema_version"."success" is '更新结果;1:成功;';

脚本格式设置为utf-8,否则中文会乱码。

5 在cmd中定位到工具根目录,然后执行flyway migrate命令

运用flyway实现数据库版本自动更新控制实录_第4张图片

6 运行过程/结果说明:

第1行进行数据库连接。如果驱动或url不对都会报错。用户名密码不对会要求手工输入。
第2行提示数据库版本验证成功。
第3行创建数据库版本更新记录表。只有第一次运行才会出现这个。
第4行显示当前数据库版本号为空
第5行开始提示按顺序提示更新进度,直到更新到最新版本为止。(意味着不能少,不能错)。
最后1行提示成功提交了一次版本更新,并给出了执行时间。

7 查询数据库验证结果

查看schema_version表结构

运用flyway实现数据库版本自动更新控制实录_第5张图片

查看schema_version数据

运行结果2
从cmd命令的运行过程,我们已经大致了解了flyway的工作流程。

四 在maven项目中调用flyway Java API自动更新数据库

1 pom文件中配置flyway架包依赖(项目中早就有jdbc就不重新配了)

<dependency>
   <groupId>org.flywaydbgroupId>
   <artifactId>flyway-coreartifactId>
   <version>4.2.0version>
dependency>

2 新增flyway的Java调用类

import org.flywaydb.core.Flyway;
import javax.sql.DataSource;

/**
 * # 该类用于控制数据库版本更新
 *
 * @author: cj Created on 2018/1/19 9:03.
 * @param:
 * @return:
 **/
public class FlywayMigration {
   /**
    * 定义私有数据源
    */
   private DataSource dataSource;

   /**
    * # 该方法用于读取配置文件的数据源
    *
    * @author: cj Created on 2018/1/19 9:14.
    * @param: dataSource spring中配置的数据源property
    * @return:
    **/
   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
   }

   /**
    * # 该方法通过调用flyway的Java API实现指定数据库的版本控制。由于在spring中配置了实例化父类时会执行该方法,所以在每次项目更新重启之后都会根据定义好的sql脚本自动将数据库更新到匹配的版本
    *
    * @author: cj Created on 2018/1/19 9:26.
    * @param:
    * @return:
    **/
   public void migrate() {
      Flyway flyway = new Flyway();
      System.out.println(flyway.getClass().getClassLoader().getResource("").getPath());//输出当前目录,用于核对脚本路径是否能正确读取
      flyway.setDataSource(dataSource);//设置数据源
      //flyway.setSchemas("flywaydemo"); // 设置接受flyway进行版本管理的多个数据库
      //flyway.setTable("schema_version");// 设置存放flyway metadata数据的表名.默认小写的schema_version
      flyway.setBaselineOnMigrate(true);//设置基线,已经开发过一段时间的数据库需要设置为true
      flyway.setLocations("db.migrations", "com.**.db.flyway.migrations"); //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径。脚本命名规约详见flyway官网
      flyway.setEncoding("UTF-8"); // 设置sql脚本文件的编码
      flyway.migrate();
   }
}

3 增加sql目录和脚本

新建脚本目录和脚本

4 spring中新增bean配置

    
    <bean id="flywayMigration" class="com.**.db.flyway.FlywayMigration" init-method="migrate">
        <property name="dataSource" ref="dataSource"/>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" depends-on="flywayMigration">
        <property name="dataSource" ref="dataSource"/>
        
        <property name="mapperLocations" value="classpath:com/**/db/mapping/*.xml"/>
    bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" depends-on="flywayMigration">
        <property name="dataSource" ref="dataSource"/>
    bean>

5 svn锁定版本更新内容

运用flyway实现数据库版本自动更新控制实录_第6张图片

6 项目运行结果

已经建立了数据库版本基线,完成了版本1.1的更新
运行结果3
运用flyway实现数据库版本自动更新控制实录_第7张图片

你可能感兴趣的:(Database)