【问题标题】:Flyway schema migration fails with DML and DDL scriptFlyway 模式迁移因 DML 和 DDL 脚本而失败
【发布时间】:2017-06-03 05:58:42
【问题描述】:

我正在使用 Spring Boot 1.4.1.RELEASE 和 Flyway。

Flyway 在执行架构迁移时无法执行 DML 脚本。

我的资源文件夹的 Flyway 结构如下:

在空数据库上执行 Flyway,工作正常。它为数据库创建架构和数据。

但是一旦执行架构迁移(即更改 DML 和 DDL 脚本),Flyway 会显示以下错误消息:

Caused by: org.flywaydb.core.api.FlywayException: Schema `testDB` contains a failed migration to version 1.02 !
    at org.flywaydb.core.internal.command.DbMigrate$2.doInTransaction(DbMigrate.java:196) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.internal.command.DbMigrate$2.doInTransaction(DbMigrate.java:156) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.internal.command.DbMigrate.migrate(DbMigrate.java:156) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:1059) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.Flyway.execute(Flyway.java:1418) ~[flyway-core-3.2.1.jar:na]
    at org.flywaydb.core.Flyway.migrate(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na]
    at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-1.4.1.RELEASE.jar:1.4.1.RELEASE]

我的 application-dev.properties 看起来像这样:

flyway.enabled=true
flyway.url: jdbc:mysql://localhost:3306
flyway.user: usertest
flyway.password: testtest
flyway.schemas=testDB
flyway.baseline-on-migrate=true
flyway.locations:classpath:/db/migration/dev,/db/data

# Naming strategy
spring.jpa.hibernate.naming.strategy= org.hibernate.cfg.ImprovedNamingStrategy

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql = true
logging.level.org.hibernate.SQL=debug
spring.jpa.hibernate.format_sql=true
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

spring.jpa.generate-ddl = false
spring.jpa.hibernate.ddl-auto =none

【问题讨论】:

  • 它说迁移失败。在空数据库上执行时应该有一些错误。可以发一下吗?
  • 我想我找到了 Flyway 失败的原因:它无法删除数据库中以前的条目! Flyway 如何配置以便在插入新数据之前删除旧条目?
  • 你只需在delete from my_table where ...这样的sql文件中编写语句
  • 这不是一个选项。我通过使用 Spring Bean 并调用 Flyway 类的 clean 方法解决了这个问题。

标签: spring-boot flyway


【解决方案1】:

该异常仅意味着在 flyway 在迁移执行时标识的一组“新”迁移中,一个或多个脚本导致错误。

Flyway 创建一个表,在其中跟踪执行的迁移脚本及其校验和,您可以验证该表,它应该在执行结果列中包含一个或多个“0”。

当您处于这种情况时(从本地到开发阶段),您仍然可以简单地删除迁移表中不成功的行,更正有罪的脚本,最后再次启动 flyway 迁移。

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 2021-02-11
    • 2019-01-16
    • 2018-02-28
    • 2016-02-07
    • 2011-11-05
    • 1970-01-01
    • 2019-04-28
    • 2012-08-09
    相关资源
    最近更新 更多