【发布时间】:2018-09-20 02:12:23
【问题描述】:
如何管理处理相同数据库架构的多个项目。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。
例如:
我有一个带有 FlywayInitializer 类的 Spring Boot Project X。
@PostConstruct
public void migrateFlyway() {
final Flyway flyway = new Flyway();
flyway.setSchemas("schema1");
flyway.setLocations("classpath:x.migration");
flyway.migrate();
}
我有一个子模块项目 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
如何将相同的模式名“schema1”与 Flyway 一起用于 Project X 和 Y?
编辑: 感谢@jesper_bk 帮助了我。这正是我想要的,这两个项目在同一架构中具有完全“独立的生活”。但是现在我有以下问题:
第一个执行的项目 X 正确创建表,但如果项目 Y 启动,我收到错误 Found non-empty schema without metadata table。所以我必须将 BaselineOnMigrate 设置为 true。但是,如果我将 BaselineOnMigrate 设置为 true,项目 Y 会跳过 sql 文件 V1.0_create_tableY.sql 并以 V1.1_update_tableY.sql 开头。我怎样才能达到,第一个 sql 脚本 V1.0_create_tableY.sql 也为项目 Y 执行?
@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();
}
【问题讨论】:
-
关于你的第二个问题我不完全确定,但我相信
baselineVersionAsString应该是 -
谢谢,它适用于版本 0
-
没问题。为后代的解决方案添加了注释。
标签: sql spring-boot flyway