1.简介
本文介绍了Flyway的 关键概念以及我们如何使用此框架可靠,轻松地不断重新构建应用程序的数据库模式。最后,我们将介绍使用Maven Flyway插件管理内存H2数据库的示例。
Flyway使用迁移将数据库从一个版本更新为下一个版本。我们可以在SQL中使用数据库特定语法编写迁移,也可以在Java中编写迁移以进行高级数据库转换。
迁移可以是版本化的,也可以是可重复的。前者有一个独特的版本,只适用一次。后者没有版本。相反,每次校验和更改时(重新)应用它们。
在单个迁移运行中,在执行挂起的版本化迁移后,始终会始终应用可重复的迁移。可重复迁移按其描述顺序应用。对于单个迁移,所有语句都在单个数据库事务中运行。
在本文中,我们主要关注如何使用Maven插件执行数据库迁移。
2. Flyway Maven插件
要安装Flyway Maven插件,请在pom.xml中添加以下插件定义:
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>4.0.3</version>
</plugin>
您可以查看Maven存储库上可用的最新插件版本。
该Maven插件可以以四种不同的方式配置。请参阅文档以获取所有可配置属性的列表。
2.1。插件配置
我们可以通过使用pom.xml的插件定义中的
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>4.0.3</version>
<configuration>
<user>databaseUser</user>
<password>databasePassword</password>
<schemas>
<schema>schemaName</schema>
</schemas>
...
</configuration>
</plugin>
2.2。Maven属性
我们也可以通过在pom.xml中将可配置属性指定为Maven 属性来配置插件:
<project>
...
<properties>
<flyway.user>databaseUser</flyway.user>
<flyway.password>databasePassword</flyway.password>
<flyway.schemas>schemaName</flyway.schemas>
...
</properties>
...
</project>
2.3。外部配置文件
我们还可以在单独的.properties文件中提供插件配置:
flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=schemaName
...
默认配置文件名是flyway.properties,它应与pom.xml文件位于同一目录中。编码由flyway.encoding指定(默认为UTF-8)。
如果您使用任何其他名称(例如customConfig.properties)作为配置文件,则应在调用Maven命令时显式指定它:
$ mvn -Dflyway.configFile=customConfig.properties
2.4。系统属性
最后,在命令行上调用Maven时,所有配置属性也可以指定为系统属性:
$ mvn -Dflyway.user=databaseUser -Dflyway.password=databasePassword
-Dflyway.schemas=schemaName
以多种方式指定配置时,以下是优先顺序:
- 系统属性
- 外部配置文件
- Maven属性
- 插件配置
3.迁移示例
在本节中,我们将介绍使用Maven插件将数据库模式迁移到内存中H2数据库所需的步骤。我们使用外部文件来配置Flyway。
3.1。更新POM
在pom.xml中为H2数据库添加适当的数据库驱动程序依赖项:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
</dependency>
您可以检查Maven存储库上可用的最新版驱动程序。将Flyway插件添加到pom.xml,如上面第2节所述。
3.2。使用外部文件配置Flyway
使用以下内容在$ PROJECT_ROOT中创建文件myFlywayConfig.properties:
flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=app-db
flyway.url=jdbc:h2:mem:DATABASE
flyway.locations=filesystem:db/migration
以上配置指定我们的迁移脚本位于db / migration目录中。它使用databaseUser和databasePassword连接到内存中的H2实例。
应用程序数据库架构是app-db。请用您的数据库用户名,数据库密码和数据库主机/端口相应地替换flyway.user,flyway.password,flyway.url。
3.3。定义第一次迁移
Flyway遵循以下迁移脚本的命名约定:
<Prefix><Version>_<Description>.sql
哪里:
示例:V1_1_0__my_first_migration.sql
使用名为V1_0__create_employee_schema.sql的迁移脚本在$ PROJECT_ROOT中创建目录db / migration,其中包含用于创建例如employee表的SQL指令:
CREATE TABLE IF NOT EXISTS `employee` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(20),
`email` varchar(50),
`date_of_birth` timestamp
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
3.4。执行迁移
从$ PROJECT_ROOT调用以下Maven命令来执行数据库迁移:
$ mvn clean flyway:migrate -Dflyway.configFile=myFlywayConfig.properties
这应该导致第一次成功迁移。现在可以将数据库模式描述如下:
employee:
+----+------+-------+---------------+
| id | name | email | date_of_birth |
+----+------+-------+---------------+
重复3.3小节中的步骤。和3.4。随意定义和运行新的迁移。
3.5。定义并执行第二次迁移
创建名为V2_0_create_department_schema.sql的第二个迁移文件,其中包含以下两个查询:
CREATE TABLE IF NOT EXISTS `department` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(20)
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
ALTER TABLE `employee` ADD `dept_id` int AFTER `email`;
执行上面第3.4节中提到的类似迁移。成功执行第二次迁移后,数据库模式如下所示。
employee:
+----+------+-------+---------+---------------+
| id | name | email | dept_id | date_of_birth |
+----+------+-------+---------+---------------+
department:
+----+------+
| id | name |
+----+------+
我们现在可以通过调用以下Maven命令来验证两次迁移是否确实成功:
$ mvn flyway:info -Dflyway.configFile=myFlywayConfig.properties
4. How Flyway Works
要跟踪已应用的迁移,何时以及由谁,它会为您的架构添加一个特殊的簿记表。此元数据表还跟踪迁移校验和以及迁移是否成功。
该框架执行以下步骤以适应不断发展的数据库模式:
- 它检查数据库模式以查找其元数据表(默认情况下为SCHEMA_VERSION)。如果元数据表不存在,它将创建一个
- 它扫描应用程序类路径以查找可用的迁移
- 它将迁移与元数据表进行比较。如果版本号低于或等于标记为当前的版本,则忽略该版本号
- 它将任何剩余的迁移标记为待定迁移。这些按版本号排序并按顺序执行
- 在应用每个迁移时,元数据表会相应更新
5.命令
Flyway支持以下基本命令来管理数据库迁移。
- 信息:打印数据库模式的当前状态/版本。它会打印哪些迁移待处理,已应用哪些迁移,应用迁移的状态以及应用这些迁移的时间。
- 迁移:将数据库架构迁移到当前版本。它会扫描类路径以查找可用的迁移并应用挂起的迁移。
- 基线:基准现有数据库,不包括所有迁移,包括 baselineVersion。Baseline有助于在现有数据库中启动Flyway。然后可以正常应用较新的迁移。
- 验证:根据可用的迁移验证当前数据库架构。
- 修复:修复元数据表。
- 清除:删除已配置架构中的所有对象。删除所有数据库对象。当然,您不应该在任何生产数据库上使用clean。