flyway数据库迁移、版本控制

使用Flyway进行数据库迁移、版本控制

flyway官网

快速上手很简单,flyway配置极少,以约定为主。

简单的使用介绍,更多详细信息会持续更新。

项目中flyway集成h2数据库

Maven插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- flyway-->
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>6.0.2</version>
<configuration>
<url>jdbc:h2:~/H2database</url>
<user>root</user>
<password>123456</password>
</configuration>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
</dependencies>
</plugin>

Gradle插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
buildscript {
dependencies {
classpath 'com.h2database:h2:1.4.197'
}
}

plugins {
id "org.flywaydb.flyway" version "6.0.2"
}

flyway {
url = 'jdbc:h2:file:./target/foobar'
user = 'sa'
}

###

快速使用

  • Maven项目为例:

resources目录下建立db/migration文件夹,然后在里面放入固定前缀的sql文件即可,V1__表示版本1:

  • 文件内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
create table USER
(
ID BIGINT auto_increment,
NICKNAME VARCHAR(100) not null,
PASSWORD VARCHAR(100),
EMAIL VARCHAR(200) not null
constraint USER_EMAIL_UINDEX
unique,
AVATARIMAGE VARCHAR(500),
GITHUB_ID VARCHAR(500)
constraint USER_GITHUB_ID_UINDEX
unique,
GMT_CREATE BIGINT not null,
GMT_MODIFIED BIGINT not null,
constraint USER_PK
primary key (ID)
);

comment on table USER is '论坛的用户表';

comment on column USER.GMT_CREATE is '创建时间戳';

comment on column USER.GMT_MODIFIED is '变更时间戳';

create unique index USER_ID_UINDEX
on USER (ID);

创建了一个User表

  • 然后在命令行运行:
1
mvn flyway:migrate

会自动运行刚刚目录下的sql:

  • 然后观察数据库,会发现数据库多了一张表:

这个表里是已执行sql的历史记录,对应版本。

tips:

  • 已执行的sql下次运行将不会再被执行

  • 如果原sql被改变,会在运行时报错停止,保护数据库原先版本

当改动了原sql或有其他异常时,可尝试以下命令:

1
mvn flyway:repair

删除失败的迁移项,并且重新对齐迁移校验,修复SCHEMA_VERSION

  • V1__两个下划线,这个前缀代表版本1,后面的名字是自定义描述,比如:

如文件名:V1__Create_User_Table.sql,

Create_User_Table是描述信息,

V是Version,数字是版本号。

  • 撤销
1
mvn flyway:undo

社区版是不支持的这个功能的,大概是要付费了