使用 Flyway 设置多个数据库

Posted

技术标签:

【中文标题】使用 Flyway 设置多个数据库【英文标题】:Setting up multiple database with Flyway 【发布时间】:2018-12-23 02:37:19 【问题描述】:

我正在尝试使用 Flyway 5.0.7 设置两个不同的数据库,用于开发的 mysql 和用于测试的 H2。我已经在各自的文件中配置了两个数据库。

对于开发src/main/resource/application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/moment
spring.datasource.username=root
spring.datasource.password=root

flyway.locations=db/migration,db/specific/mysql

对于测试src/test/resource/application.properties

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

flyway.locations=db/migration,db/specific/h2

下面是 Flyway 迁移文件的文件夹结构

在这种情况下,Flyway 无法在 specific 文件夹下找到迁移文件,并在为 table not found 应用 V1.1__Insert_Records.sql 时引发错误。

如果我将specific 文件夹移动到db/migration 中,我会收到相同版本的重复文件的错误。

我应该如何为多个数据库配置迁移文件以使用 Flyway?

【问题讨论】:

你使用的是spring boot 2.x吗?如果是这样,下面的答案有帮助吗?如果没有,您使用的是什么版本? 【参考方案1】:

我怀疑您可能在这里使用 Spring Boot 2.x?如果是这样,flyway.locations 不再有效,将被忽略。

Flyway 然后将只使用默认位置 (db/migration),它将仅找到 V1.1__Insert_Records.sql 脚本,而不是 V1__Create_table.sql 脚本。

使用 Spring Boot 2.x,flyway.locations must be prefixed with spring.

spring.flyway.locations=db/migration,db/specific/h2

顺便说一句,如果你在位置中使用vendor占位符,则Spring Boot will work out the directory来自数据库驱动程序ID(h2、mysql、oracle等)的小写,这很好:

spring.flyway.locations=db/migration,db/specific/vendor

【讨论】:

我必须通过前缀 classpath: spring.flyway.locations=classpath:/db/migration,classpath:/db/specific/h2 来具体说明位置

以上是关于使用 Flyway 设置多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flyway 配置处理多个数据库

使用 Maven + Flyway 迁移/清理/等多个数据库

flyway-maven-plugin:如何一起执行多个数据库配置?

使用 Flyway 在多个模式上运行 SQL 脚本

使用 Flyway 部署到多个模式

用于控制多个数据库的 dbms 更改的 flyway 位置