美文网首页
flyway使用

flyway使用

作者: CXY_XZL | 来源:发表于2019-10-24 17:32 被阅读0次

一、下载flyway

官网地址:https://flywaydb.org/

以下演示的所有示例都是Community Flyway 版本,版本区别详见https://flywaydb.org/download/


二、简述

Flyway是一个开源数据库迁移工具,引用官言就是:

Flyway is an open-source database migration tool

而且它基于 7 个基本命令,分别如下:

  • Migrate(迁移):将schema更新到最新的版本并且如果不存在flyway_schema_history表就会创建一个。
    它是flyway工作流程的核心。它将扫描文件系统或您的类路径以获取可用的迁移。它将它们与已应用于数据库的迁移进行比较,如果发现任何差异,它将迁移数据库以缩小差距。
  • clean(删除):删除已配置的schema中所有对象,当然,不要对生产DB操作,毕竟有点类似删库跑路。。。
  • info(信息):打印所有的Migration的信息,包含状态,通过info可以知道哪些Migration已经应用了,哪些处于pending状态
  • Validate(验证):验证将要更新的migrations是否与已更新的migration有冲突,有点类似于代码合并时git会检查是否有冲突
  • Undo(撤销):撤消最近应用的版本迁移。可指定撤销的最终版本。
    -BaseLine(基准线):相对于Migrate来说,它不再是从最初开始迁移,而是先将某数据库作为基准线,然后迁移相对此数据库还未更新的migrations
  • repaire(修复):修复flyway_schema_history

三、命令行工具尝试

在第一步中下载了flyway后,我们需要先修改一下配置文件flyway.conf,修改部分如下:

flyway.url=jdbc:h2:file:./foobardb

上面设置的是连接一个内存数据库h2,当然也可以设置成mysql,但是有点限制:

支持版本.png
从上图可以看出,5.7+版本的mysql是受flyway所有版本(CommunityProEnterprise )支持的,5.6-版本的mysql只受Flyway Enterprise版本支持,不过这个版本是可以试用的。

我们可以直接用命令行工具尝试一下一些命令:

  • migrate
flyway migrate

结果如下:

Database user:
Database password:
Flyway Community Edition 6.0.7 by Redgate
Database: jdbc:h2:file:./foobardb (H2 1.4)
Successfully validated 1 migration (execution time 00:00.068s)
Creating Schema History table "PUBLIC"."flyway_schema_history" ...
Current version of schema "PUBLIC": << Empty Schema >>
Migrating schema "PUBLIC" to version 1 - Create person table
Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.124s)

上面的密码用户都留空是因为刚才在修改配置文件的时候,我并没有修改用户和密码项,也就意味着连接时用户和密码都是空,同时也说明只有url是必填的。

  • info
flyway info

结果如下:

Database user:
Database password:
Flyway Community Edition 6.0.7 by Redgate
Database: jdbc:h2:file:./foobardb (H2 1.4)
Schema version: 1

+-----------+---------+---------------------+------+---------------------+---------+
| Category  | Version | Description         | Type | Installed On        | State   |
+-----------+---------+---------------------+------+---------------------+---------+
| Versioned | 1       | Create person table | SQL  | 2019-10-24 14:44:38 | Success |
+-----------+---------+---------------------+------+---------------------+---------+
  • validate
flyway validate

结果如下:

F:\flyway\flyway-6.0.7>flyway validate
Database user:
Database password:
Flyway Community Edition 6.0.7 by Redgate
Database: jdbc:h2:file:./foobardb (H2 1.4)
Successfully validated 1 migration (execution time 00:00.118s)

其他的就不一一列举了,大家可以参考https://flywaydb.org/documentation/command/migrate来操作一下


四、Java集成

4.1 限制

集成限制.png

4.2 依赖

  • maven
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.0.7</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.199</version>
 </dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
 </dependency>
  • gradle
compile "org.flywaydb:flyway-core:6.0.7"
compile "com.h2database:h2:1.4.999"
compile "org.springframework.boot:spring-boot-starter"

4.3 项目结构

项目结构.png

4.4 示例代码-FlywayApplication

@SpringBootApplication
public class FlywayApplication {

    private static Logger log = LoggerFactory.getLogger(FlywayApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(FlywayApplication.class, args);

        Flyway flyway = Flyway.configure().dataSource("jdbc:h2:file:./foobardb","xzl","123456").load();

        log.info("数据开始迁移======");
        flyway.migrate();
        log.info("数据结束迁移------");
    }
}

4.5 sql

在创建项目的时候,如果一开始就选择了flyway组件,那么创建完的项目就会在resources目录下自带db/migration文件夹,flyway在进行migrate等操作时,默认扫描此包下的sql文件,所以在此包下我们可以创建一个sql文件,但这个sql文件名不能乱取,规则如下:

取名规则.png

文件名由以下部分组成:

  • 前缀V用于版本化迁移,U撤消迁移,R可重复迁移
  • 版本:下划线(在运行时自动替换为点)可根据需要分隔任意多个部分(不适用于可重复的迁移)
  • 分隔符:(__两个英文下划线)
    说明:下划线(在运行时自动由空格代替)将单词分开
    如果需要对类名进行更多控制,则可以通过JavaMigration直接实现接口来覆盖默认约定 。
  • JavaMigratiion原代码如下:
public interface JavaMigration {
    MigrationVersion getVersion();

    String getDescription();

    Integer getChecksum();

    boolean isUndo();

    boolean canExecuteInTransaction();

    void migrate(Context var1) throws Exception;
}

默认取名规则是由BaseJavaMigration这个抽象类决定的,源代码如下:

public abstract class BaseJavaMigration implements JavaMigration {

    private final MigrationVersion version;
    private final String description;

    public BaseJavaMigration() {
        //获取sql文件的名称
        String shortName = this.getClass().getSimpleName();

        //判断是否是可重复迁移
        boolean repeatable = shortName.startsWith("R");

        //判断是否是版本化迁移或者可重复迁移
        if (!shortName.startsWith("V") && !repeatable) {
            
            //不满足条件,掏出异常
            throw new FlywayException("Invalid Java-based migration class name: " + this.getClass().getName() + " => ensure it starts with V or R, or implement org.flywaydb.core.api.migration.JavaMigration directly for non-default naming");
        } else {
            //获取前缀--V/R
            String prefix = shortName.substring(0, 1);

            //获取Pair对象,封装了version和description
            Pair info = MigrationInfoHelper.extractVersionAndDescription(shortName, prefix, "__", new String[]{""}, repeatable);
            this.version = (MigrationVersion)info.getLeft();
            this.description = (String)info.getRight();
        }
    }

    public MigrationVersion getVersion() {
        return this.version;
    }

    public String getDescription() {
        return this.description;
    }

    public Integer getChecksum() {
        return null;
    }

    public boolean isUndo() {
        return false;
    }

    public boolean canExecuteInTransaction() {
        return true;
    }
}

通过以上代码可以发现,明明规则没有对可撤销迁移操作(U开头)文件进行判断,这是因为Undo操作至少需要Flyway Pro版本才能支持,如果您有看过这张表格就会明白了,我给大家截两个小图看看:


image.png
em...把这两张图拼一拼就可以了

启动程序,结果如下:

2019-10-24 16:49:56.007  INFO 6432 --- [           main] xzl.xiongzelin.flyway.FlywayApplication  : 数据开始迁移======
2019-10-24 16:49:56.015  INFO 6432 --- [           main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 6.0.7 by Redgate
2019-10-24 16:49:56.369  INFO 6432 --- [           main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:h2:file:./foobardb (H2 1.4)
2019-10-24 16:49:56.662  INFO 6432 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.082s)
2019-10-24 16:49:56.709  INFO 6432 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "PUBLIC": 1.0.0
2019-10-24 16:49:56.713  INFO 6432 --- [           main] o.f.core.internal.command.DbMigrate      : Schema "PUBLIC" is up to date. No migration necessary.
2019-10-24 16:49:57.445  INFO 6432 --- [           main] xzl.xiongzelin.flyway.FlywayApplication  : 数据结束迁移------

刚才的代码中只有迁移操作,不过其他操作也是类似的,大家可以看看Flyway这个类的方法,这里就不说明了。


五、maven启动

5.1 限制

Flyway Community版本和Flyway Pro支持Maven 3.x,同时还要求java版本在 8+,Flyway Enterprise支持java 7

5.2 插件

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>6.0.7</version>
</plugin>

5.3 属性配置

从上面的讲解可以知道,属性url必须配置,userpassword可以空着。
配置属性的几种方式:

  • 在flyway插件下配置configuration属性,如下:
<plugin>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-maven-plugin</artifactId>
        <version>6.0.7</version>
        <!--配置属性-->
        <configuration>
             <user>xzl</user>
             <password>123456</password>
             <url>jdbc:h2:file:./foobardb</url>
        </configuration>
</plugin>

这是最简单的配置方式,不过它有一个缺点,就是不能配置空值,否则报错。

  • maven properties,如下:
<properties>
        <flyway.url>jdbc:h2:file:./foobardb</flyway.url>
        <flyway.user>xzl</flyway.user>
        <flyway.password>123456</flyway.password>
        <java.version>1.8</java.version>
    </properties>
  • maven 的setting.xml文件
<settings>
    <servers>
        <server>
            <!-- By default Flyway will look for the server with the id 'flyway-db' -->
            <!-- This can be customized by configuring the 'serverId' property -->
            <id>flyway-db</id>
            <url>jdbc:h2:file:./foobardb</url>
            <username>myUser</username>
            <password>mySecretPwd</password>
        </server>
    </servers>
</settings>
  • 系统环境变量
FLYWAY_URL:jdbc:h2:file:./foobardb
FLYWAY_USER:xzl
FLYWAY_PASSWORD:123456
  • jvm系统属性
mvn -Dflyway.url=jdbc:h2:file:./foobardb -Dflyway.user=xzl -Dflyway.password=123456
  • 自定义配置文件
    文件格式如下,flyway默认使用utf-8加载配置文件:
# These are some example settings
flyway.url=jdbc:mydb://mydatabaseurl
flyway.schemas=schema1,schema2
flyway.placeholders.keyABC=valueXYZ

命令:

 mvn -Dflyway.configFiles=path/to/myAlternativeConfig.conf flyway:migrate
  • flyway.conf配置文件
    Flyway将搜索并自动加载<user-home>/flyway.conf配置文件(如果存在)。

加载优先顺序:

  1. jvm系统属性
  2. 系统环境变量
  3. 自定义配置文件
  4. maven properties
  5. 配置configuration属性
  6. maven 的setting.xml文件
  7. flyway.conf配置文件
  8. Flyway Maven插件默认

这就意味着:flyway.url如果既存在于jvm系统属性又存在于configuration标签中,那么JVM系统属性将具有优先权并被使用。

相关文章

网友评论

      本文标题:flyway使用

      本文链接:https://www.haomeiwen.com/subject/gxnrvctx.html