80.5.1 启动时执行Flyway数据库迁移

想要在启动时自动运行Flyway数据库迁移,需要将org.flywaydb:flyway-core添加到你的classpath下。

迁移是一些V<VERSION>__<NAME>.sql格式的脚本(<VERSION>是一个下划线分割的版本号,比如'1'或'2_1')。默认情况下,它们存放在classpath:db/migration文件夹中,但你可以设置spring.flyway.locations改变它。你也可以添加一个特殊的{vendor}占位符,来使用特殊指定的脚本。假定如下:

spring.flyway.locations=db/migration/{vendor}

这项配置将会根据数据库的类型设置使用的文件夹(比如MySQL对应的是db/migration/mysql),而不是使用db/migration。支持的数据库的一览在DatabaseDriver.

详情可参考flyway-core中的Flyway类,查看一些可用的配置,比如schemas。Spring Boot在FlywayProperties中提供了一个小的属性集,可用于禁止迁移,或关闭位置检测。Spring Boot将调用Flyway.migrate()执行数据库迁移,如果想要更多控制可提供一个实现FlywayMigrationStrategy@Bean

Flyway支持SQL和Java回调。为了使用基于SQL的回调,在classpath:db/migration文件夹里放置回调脚本。为了使用基于Java的回调,创建一个或者更多的实现了FlywayCallback,或者最好是扩展了BaseFlywayCallback的bean。任何这样的bean会自动在Flyway注册。它们能够通过使用@Order或者实现Ordered来指定顺序。

默认情况下,Flyway将自动注入(@PrimaryDataSource到你的上下文,并用它进行数据迁移。如果想使用不同的DataSource,你可以创建一个,并将它标记为@FlywayDataSource@Bean。如果你这样做了,且想要两个数据源,记得创建另一个并将它标记为@Primary,或者你可以通过在外部配置文件中设置spring.flyway.[url,user,password]来使用Flyway的原生数据源。设置spring.flyway.urlspring.flyway.user足以导致Flyway使用自己的数据源。如果没有设置这三个属性中的任何一个,则将使用与其等效的spring.datasource属性的值。

这是一个Flyway示例,你可以作为参考。

你也可以使用Flyway来为特定的场景提供数据。例如,你可以在src/test/resources放置测试指定的迁移。它们只会在你的应用为测试启动时运行。如果你想要更加的精细,你可以使用profile指定的配置来自定义spring.flyway.locations。这样,某些迁移将只会在特定profile激活的时候运行。比如,在application-dev.properties里,你可能指定了如下设置:

spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration

这样配置了以后,在dev/db/migration里的迁移将只会在dev profile激活的时候运行。

最后更新于