如何管理处理相同数据库模式的多个项目。如果被另一个项目修改,每个项目中的Flyway迁移脚本不允许启动。
例如:
我有一个带有FlywayInitializer类的spring boot项目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
如何对项目X和Y使用与Flyway相同的schemaname“schema1”?
编辑:谢谢@jesper\u bk对我的帮助。这正是我想要的,这两个项目在同一个模式中拥有完全“独立的生命”。但现在我有以下问题:
第一个执行的项目X创建表正确,但如果项目Y启动我得到错误发现非空模式没有元数据表。所以我必须设置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();
}
如果任何使用Play框架工作的人都可以为每个微服务使用独立的flyway历史表来解决这个问题,这意味着每个mircoservice都有自己的flyway历史表,根据服务命名。这将为每个服务创建flyway表,将这些属性添加到conf文件中以更改flyway表名称。
db.default.migration.table=microservice1 for 1 mircoservice
db.default.migration.table=microservice2 for 2 mircoservice
在每个microservice conf文件中添加此属性这仅用于播放框架
如果使用spring,那么我们使用的是spring/flyway db配置,所以这只是将以下内容添加到应用程序中。除第一个项目外,每个项目的属性。
flyway.table=schema_version_*<some_other_identifier>*
如果您可以在同一架构中使用两个具有完全“独立生命”的项目,则可以为这两个项目使用单独的版本表,即:
@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
应该是
我有一个关于Flyway DB迁移的问题。如何管理处理同一数据库模式的多个项目(微服务)。如果每个项目中的Flyway移植脚本被其他项目修改,则不允许启动该脚本。他们是否有相关的文档或最佳实践?
问题内容: 如何管理处理同一数据库模式的多个项目。如果每个项目中的Flyway迁移脚本被另一个项目修改,则不允许启动。 例如: 我有一个带有FlywayInitializer类的Spring Boot ProjectX。 我有一个子模块Project Y,也有他自己的FlywayInitializer类 项目结构: 如何在Flyway中为Project X和Y使用相同的架构名称“ schema1”
我对Flyway完全陌生,但我正在尝试使用https://github.com/flyway/flyway-docker描述的docker-compose flyway mysql安排来迁移许多相同的测试数据库 据我所知,< code>migrate命令可以在它的< code>-schemas参数中接受多个模式,但是它似乎只将实际的SQL迁移应用于列表中的第一个模式。 例如,当我使用< code>
我可以强制Flyway在一个事务中运行所有尚未应用的迁移,而不是让每个迁移都是自己的事务吗? 在开发环境中这不是一个问题,但是在生产环境中,您可能会执行从一个更新到下一个更新的多个迁移,其中一个迁移失败将使数据库处于“半迁移”状态,其中一些迁移已提交,而一些未提交--这是一件非常糟糕的事情。 一种解决方法是简单地将所需的所有SQL塞进一个文件中,但这样做存在一些问题:
我已经学会了我可以使用参考文献来实现这一点。但是,当我将一个ref与几个TextInputs一起使用时,我只与最后一个TextInputs一起使用
我正在试用flyway,对类路径和JAR有一个理解问题。 我有一个在多个maven模块中包含多个服务的项目。我希望每个服务都使用flyway维护其模式。因此,每个服务都是一个maven模块,具有自己的资源目录,我可以在其中放置SQL脚本,这将是JAR的一部分。现在,服务可以在嵌入式模式下运行,在嵌入式模式下,终端用户应用程序(例如tomcat)中存在多个服务JAR。 在服务初始化时,我会使用每个服