如何管理处理同一数据库模式的多个项目。如果每个项目中的Flyway迁移脚本被另一个项目修改,则不允许启动。
例如:
我有一个带有FlywayInitializer类的Spring Boot ProjectX。
@PostConstruct public void migrateFlyway() { final Flyway flyway = new Flyway(); flyway.setSchemas("schema1"); flyway.setLocations("classpath:x.migration"); flyway.migrate(); }
我有一个子模块Project Y,也有他自己的FlywayInitializer类
@PostConstruct public void migrateFlyway() { final Flyway flyway = new Flyway(); flyway.setSchemas("schema1"); flyway.setLocations("classpath:y.migration"); flyway.migrate(); }
项目结构:
Project X src | main | java FlywayInitializerX.java | resources V1.0_create_tableX.sql V1.1_update_tableX.sql Project Y src | main | java FlywayInitializerY.java | resources V1.0_create_tableY.sql V1.1_update_tableY.sql
如何在Flyway中为Project X和Y使用相同的架构名称“ schema1”?
编辑: 谢谢@jesper_bk帮助了我。正是我想要的,这两个项目在同一架构中具有完全“独立的生活”。但是现在我有以下问题:
第一个执行的项目X正确创建了表,但是如果启动了项目Y,则会出现错误: 找到没有元数据表的非空模式 。所以我必须将BaselineOnMigrate设置为true。但是,如果我将BaselineOnMigrate设置为true,则Project Y跳过sql文件 V1.0_create_tableY.sql 并以 V1.1_update_tableY.sql开头 。我如何达到也为Project Y执行了第一个sql脚本V1.0_create_tableY.sql?
@PostConstruct public void migrateFlyway() { final Flyway flyway = new Flyway(); flyway.setBaselineVersionAsString("1"); flyway.setBaselineOnMigrate(true); flyway.setSchemas("schema1"); flyway.setLocations("classpath:y.migration"); flyway.migrate(); }
如果可以在同一模式中使用两个具有完全“独立生命”的项目,则可以为这两个使用单独的版本表,即:
@PostConstruct public void migrateFlyway() { final Flyway flyway = new Flyway(); flyway.setSchemas("schema1"); flyway.setLocations("classpath:x.migration"); flyway.setTable("schema_version_y"); flyway.migrate(); }
如果希望他们使用相同的版本控制方案,最好将所有SQL脚本放在单独的第三个项目中,或者更复杂的是,让第三个项目自动从主项目中收集和枚举SQL脚本,这可能会更好。
关于第二个问题,baselineVersionAsString应小于1(例如0)。如果基准版本为1,它将确定您的第一个1.0版脚本与基准匹配,并且应该已经执行。
baselineVersionAsString