85.5 使用更高级别的数据库迁移工具
Spring Boot 支持两种更高级别的迁移工具:Flyway 和 Liquibase。
85.5.1 在启动时执行 Flyway 数据库迁移
要在启动时自动运行 Flyway 数据库迁移,请将 org.flywaydb:flyway-core 添加到您的类路径中。
迁移是 V__.sql 形式的脚本(带有下划线分隔的版本,例如“1”或“2_1”)。默认情况下,它们位于名为 classpath:db/migration 的文件夹中,但您可以通过设置 spring.flyway.locations 来修改该位置。这是一个或多个 classpath: 或 filesystem: 位置的逗号分隔列表。例如,以下配置将在默认类路径位置和 /opt/migration 目录中搜索脚本:
spring.flyway.locations=classpath:db/migration,filesystem:/opt/migration
您还可以添加一个特殊的 {vendor} 占位符来使用特定于供应商的脚本。假设如下:
spring.flyway.locations=classpath:db/migration/{vendor}
前面的配置没有使用 db/migration,而是根据数据库的类型(例如 MySQL 的 db/migration/mysql)设置要使用的文件夹。 DatabaseDriver 中提供了支持的数据库列表。
FlywayProperties 提供 Flyway 的大部分设置和一小组附加属性,可用于禁用迁移或关闭位置检查。如果您需要对配置进行更多控制,请考虑注册 FlywayConfigurationCustomizer bean。
Spring Boot 调用 Flyway.migrate() 来执行数据库迁移。如果您想要更多控制权,请提供一个实现 FlywayMigrationStrategy 的 @Bean。
Flyway 支持 SQL 和 Java 回调。要使用基于 SQL 的回调,请将回调脚本放在 classpath:db/migration 文件夹中。要使用基于 Java 的回调,请创建一个或多个实现 Callback 的 bean。任何此类 bean 都会自动向 Flyway 注册。它们可以通过使用@Order 或通过实现Ordered 来订购。也可以检测到实现了已弃用的 FlywayCallback 接口的 Bean,但它们不能与 Callback bean 一起使用。
默认情况下,Flyway 在您的上下文中自动装配 (@Primary) 数据源并将其用于迁移。如果您想使用不同的 DataSource,您可以创建一个并将其 @Bean 标记为 @FlywayDataSource。如果您这样做并且想要两个数据源,请记住创建另一个并将其标记为@Primary。或者,您可以通过在外部属性中设置 spring.flyway.[url,user,password] 来使用 Flyway 的原生数据源。设置 spring.flyway.url 或 spring.flyway.user 足以使 Flyway 使用自己的 DataSource。如果三个属性中的任何一个都没有设置,将使用其等效 spring.datasource 属性的值。
有一个 Flyway 示例,您可以了解如何设置。
您还可以使用 Flyway 为特定场景提供数据。例如,您可以将特定于测试的迁移放在 src/test/resources 中,并且它们仅在您的应用程序启动测试时运行。此外,您可以使用特定于配置文件的配置来自定义 spring.flyway.locations 以便某些迁移仅在特定配置文件处于活动状态时运行。例如,在 application-dev.properties 中,您可以指定以下设置:
spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration
通过该设置,dev/db/migration 中的迁移仅在 dev 配置文件处于活动状态时运行。
85.5.2 在启动时执行 Liquibase 数据库迁移
要在启动时自动运行 Liquibase 数据库迁移,请将 org.liquibase:liquibase-core 添加到您的类路径中。
默认情况下,从 db/changelog/db.changelog-master.yaml 读取 master 更改日志,但您可以通过设置 spring.liquibase.change-log 来更改位置。除了 YAML,Liquibase 还支持 JSON、XML 和 SQL 更改日志格式。
默认情况下,Liquibase 在您的上下文中自动连接 (@Primary) 数据源并将其用于迁移。如果您需要使用不同的 DataSource,您可以创建一个并将其 @Bean 标记为 @LiquibaseDataSource。如果您这样做并且想要两个数据源,请记住创建另一个数据源并将其标记为@Primary。或者,您可以通过在外部属性中设置 spring.liquibase.[url,user,password] 来使用 Liquibase 的本机数据源。设置 spring.liquibase.url 或 spring.liquibase.user 足以使 Liquibase 使用它自己的 DataSource。如果三个属性中的任何一个都没有设置,将使用其等效 spring.datasource 属性的值。
有关可用设置(例如上下文、默认架构等)的详细信息,请参阅 LiquibaseProperties。
有一个 Liquibase 示例,您可以了解如何进行设置。