我正在使用Flyway开发SpringBoot应用程序。我必须更新已经进行了迁移的数据库:
common
下的迁移必须在不同的环境(已加载Spring概要文件)上执行,而local
和qa
的迁移将不同的数据插入到H2数据库中。
我需要更改表(添加和修改列),然后更新在V1_1和V1_2中插入的数据。我尝试了许多不同的方法来避免将ALTER TABLE
sql命令放入 local 和 qa 迁移文件中。我想在 common 文件夹中留下ALTER TABLE
命令,而在 local 和 qa 文件夹中只有更新命令。但是所有这些都是徒劳的,我在本地目录中添加的新迁移总是在我在公共存储库中添加的迁移之前执行:
即使使用上述命名方案,V1_4也会在V1_3之前执行,这会导致错误,因为尚未添加新列。我知道这不是一个完美的命名方案,我主要将其用于测试和表达我的观点。但是,即使在进行手动测试时,flyway的行为也不会达到我的预期(肯定是由于我的误会)。应用程序日志清楚地显示V1_3未执行:
2019-08-13 13:31:04.025 INFO 26508 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1.0 - schema
2019-08-13 13:31:04.076 INFO 26508 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1.1 - institutions
2019-08-13 13:31:04.092 INFO 26508 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1.2 - data
2019-08-13 13:31:04.476 INFO 26508 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1.4 - update data
2019-08-13 13:31:04.482 ERROR 26508 --- [ main] o.f.core.internal.command.DbMigrate : Migration of schema "PUBLIC" to version 1.4 - update data failed! Please restore backups and roll back database and code!
我在发生异常的环境中使用spring.flyway.locations=classpath:db/migration/common,classpath:db/migration/local
这个属性。
我做错了什么?我似乎找不到很多有关在多个目录中进行文件迁移的文档。不幸的是,这就是我所坚持的,并且我无法更改文件结构,因为这些决定是我无法控制的。
谢谢!
答案 0 :(得分:0)
在提供迁移位置时,flyway会在该文件夹和子文件夹下查找.sql文件。因此,如果您在本地具有V1.1和V1.4,在通用中具有V1.3,flyway会将本地视为迁移文件夹并按V1.1和V1.4的顺序执行,除非您提供根目录作为您的飞行路线位置。在您的情况下,应将db.migration作为您的位置。