【问题标题】:Flyway with spring boot overwrites whole DB every time I switch run mode between WAR and IDE run每次我在 WAR 和 IDE 运行之间切换运行模式时,带有 Spring Boot 的 Flyway 都会覆盖整个数据库
【发布时间】:2018-05-17 13:12:31
【问题描述】:

在将 flyway DB 迁移与 Spring Boot 应用程序集成时,我遇到了非常奇怪的问题。

当我使用命令行从可执行 WAR 运行应用程序时,它会在应用程序启动时创建新数据库。 现在,如果我将应用程序运行模式切换到 IDE(即从 STS 运行),它会再次触发我的 db/migration 文件夹中的所有脚本。每次在这两种运行模式之间切换时,我都可以看到 installed_on 列时间发生变化。我尝试启用baselineOnMigrate 属性,但没有得到任何效果。 你认为它与spring boot嵌入式tomcat有关吗?因为在两次运行时它都会创建单独的嵌入的 tomcat。

请在下面找到我的 spring boot application.properties:

mssql.dbname=issueDB
mssql.password=password
mssql.dbserver=localhost
mssql.port=1501

spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://${mssql.dbserver}:${mssql.port};databaseName=${mssql.dbname}
spring.datasource.username=user
spring.datasource.password=${mssql.password}

spring.flyway.baselineOnMigrate=true
spring.flyway.locations=classpath:db/migration/testissue
spring.flyway.out-of-order=true
spring.flyway.baseline-version=1.3
spring.flyway.placeholder-prefix=$
spring.flyway.placeholder-suffix=$
spring.flyway.mixed=true
spring.flyway.cleanOnValidationError=true

【问题讨论】:

    标签: spring-boot flyway


    【解决方案1】:

    我想,这可能是由这个属性spring.flyway.cleanOnValidationError=true 引起的。根据docs

    发生验证错误时是否自动调用clean。

    这只是为了方便开发。即使很难,我们也强烈建议在将迁移脚本签入 SCM 并运行后不要更改它们,这提供了一种以平稳方式处理这种情况的方法。数据库将自动擦除干净,确保下一次迁移将带您回到签入 SCM 的状态。

    如果您在同一个数据库上以不同的方式运行应用程序,那么您可能会遇到一些验证问题,而 flyway 只需清理您的数据库并用当前脚本状态覆盖它。

    【讨论】:

    • 是的,这就是原因,感谢您的支持。我发现当我尝试在 IDE 和 WAR 中运行时会发生校验和不匹配。现在 gradle bootWar 目标在这里引起了一些问题。你对此有什么想法吗?
    猜你喜欢
    • 2022-01-08
    • 2022-01-23
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2010-11-21
    相关资源
    最近更新 更多