Database Migrations with Flyway


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

以多种方式指定配置时,以下是优先顺序:

  1. 系统属性
  2. 外部配置文件
  3. Maven属性
  4. 插件配置

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

哪里:

<Prefix> - 默认前缀为V,可以使用flyway.sqlMigrationPrefix属性在上述配置文件中配置。 <Version>- 迁移版本号。主要版本和次要版本可以用下划线分隔。迁移版本应始终以1开头。

<描述> - 迁移的文本描述。描述需要与带有双下划线的版本号分开。 示例: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

要跟踪已应用的迁移,何时以及由谁,它会为您的架构添加一个特殊的簿记表。此元数据表还跟踪迁移校验和以及迁移是否成功。

该框架执行以下步骤以适应不断发展的数据库模式:

  1. 它检查数据库模式以查找其元数据表(默认情况下为SCHEMA_VERSION)。如果元数据表不存在,它将创建一个
  2. 它扫描应用程序类路径以查找可用的迁移
  3. 它将迁移与元数据表进行比较。如果版本号低于或等于标记为当前的版本,则忽略该版本号
  4. 它将任何剩余的迁移标记为待定迁移。这些按版本号排序并按顺序执行
  5. 在应用每个迁移时,元数据表会相应更新

5.命令

Flyway支持以下基本命令来管理数据库迁移。

  • 信息:打印数据库模式的当前状态/版本。它会打印哪些迁移待处理,已应用哪些迁移,应用迁移的状态以及应用这些迁移的时间。
  • 迁移:将数据库架构迁移到当前版本。它会扫描类路径以查找可用的迁移并应用挂起的迁移。
  • 基线:基准现有数据库,不包括所有迁移,包括 baselineVersion。Baseline有助于在现有数据库中启动Flyway。然后可以正常应用较新的迁移。
  • 验证:根据可用的迁移验证当前数据库架构。
  • 修复:修复元数据表。
  • 清除:删除已配置架构中的所有对象。删除所有数据库对象。当然,您不应该在任何生产数据库上使用clean。