> For the complete documentation index, see [llms.txt](https://jack80342.gitbook.io/spring-boot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack80342.gitbook.io/spring-boot/ix.-how-to-guides/80.-database-initialization/80.5-use-a-higher-level-database-migration-tool/80.5.1-execute-flyway-database-migrations-on-startup.md).

# 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`](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java).

详情可参考flyway-core中的`Flyway`类，查看一些可用的配置，比如schemas。Spring Boot在[FlywayProperties](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java)中提供了一个小的属性集，可用于禁止迁移，或关闭位置检测。Spring Boot将调用`Flyway.migrate()`执行数据库迁移，如果想要更多控制可提供一个实现[FlywayMigrationStrategy](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationStrategy.java)的`@Bean`。

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

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

这是一个[Flyway示例](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-samples/spring-boot-sample-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激活的时候运行。
