一、下载flyway
以下演示的所有示例都是
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所有版本(Community ,Pro ,Enterprise )支持的,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必须配置,user和password可以空着。
配置属性的几种方式:
- 在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配置文件(如果存在)。
加载优先顺序:
- jvm系统属性
- 系统环境变量
- 自定义配置文件
- maven properties
- 配置
configuration属性 - maven 的setting.xml文件
- flyway.conf配置文件
- Flyway Maven插件默认
这就意味着:flyway.url如果既存在于jvm系统属性又存在于configuration标签中,那么JVM系统属性将具有优先权并被使用。












网友评论