spring-boot - 如何使用 flyway 和单数据库处理模块化 Spring 项目

标签 spring-boot database-migration flyway modularity spring-config

这个问题在这里已经有了答案:





Flyway multiple metadata tables in one schema

(2 个回答)


4年前关闭。




情况

我有一个模块化 Spring Boot项目。作为数据库模式管理器,我想使用 Flyway .
如前所述,该项目是模块化的。这是因为会有不同的配置使用不同的模块。这意味着,我想将与模块相关的所有内容打包到它的特定项目中。与 Flyway这似乎不是那么简单。

问题

我理想中的想象:

ApplicationA
|
|_Module1
|  |
|  |_db/migration
|       |
|       |_V1__InitModule1Tables
|       |_V2__MigrateSomeTable
|      
|_Module2
   |
   |_db/migration
        |
        |_V1__InitModule2Tables
        |_V2__MigrateSomeTable

每个模块独立定义自己的飞行脚本,因为它们无论如何都不知道彼此的存在。每个模块显然都需要在共享数据库中拥有自己的飞行路线历史记录表。这样整个系统就解耦了,配置下一个应用ApplicationBModule1Module3不会很麻烦。

好吧,我没有找到 Flyway 的任何配置可能性达到这个解决方案。

我试过的

在每个模块中做这样的事情显然是一个坏主意,因为 bean 的初始化/执行顺序是相当随机的,导致当我需要它们用于其他配置时没有创建表。也显得凌乱。
@Configuration
public class Module1Config {

    @Autowired
    public void flyway(DataSource dataSource) {
    Flyway flyway = new Flyway();
    flyway.setBaselineOnMigrate(true);
    flyway.setTable(flyway.getTable() + "-module1");
    flyway.setDataSource(dataSource);
    flyway.migrate();
    }
}

我不认为我是第一个试图实现这一目标的人。我怎样才能达到所需的模块化 Flyway配置?

* 更新 *

解决方案

以下解决方案以重复主题建议的方式工作,对我有用:

我在我的 base 中创建了一个配置模板任何其他模块使用的模块,因为它提供日志记录和日志记录等全局功能。
public abstract class FlywayConfig {

    private final String moduleName;

    public FlywayConfig(String moduleName) {
    this.moduleName = moduleName;
    }

    private final String baseScriptLocation = "classpath:db.migration.";

    @Autowired
    public void migrate(DataSource dataSource) {
        Flyway flyway = new Flyway();
        flyway.setDataSource(dataSource);
        flyway.setSchemas(moduleName.toUpperCase());
        flyway.setLocations(baseScriptLocation + moduleName.toLowerCase());
        flyway.migrate();
    }
}

在每个模块中,我只是简单地扩展了这个配置类
@Configuration
public class BaseConfig extends FlywayConfig {

    public static final String MODULE_NAME = "base";

    public BaseConfig() {
    super(MODULE_NAME);
    }
}

而我将飞行路线脚本保存在 db.migration.*MODULE_NAME*

最佳答案

这里实际上只有两种可能的情况:

  • 您的模块是完全独立的,数据库中属于不同模块的对象之间没有关系:每个模块使用单独的模式历史表。
  • 您的模块确实具有与属于其他模块的对象相关的数据库对象:您现在实际上拥有数据库的单个全局生命周期,因此应该为所有模块使用单个模式历史表。

  • 有关模块化应用程序的更多信息:https://speakerdeck.com/axelfontaine/majestic-modular-monoliths

    关于spring-boot - 如何使用 flyway 和单数据库处理模块化 Spring 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49303184/

    相关文章:

    postgresql - 如何在 docker 中使用 flyway 初始化 postgres db?

    mysql - 无法从 Spring Boot 应用程序运行 flyway 脚本,数据库作为 docker 容器中的 Mysql

    spring - 模拟 OAuth 服务器进行测试

    java - 方法返回 JSON "empty:false"尽管这个 JSON 有数据

    java - 如何使用 Spring Boot/javax.net.ssl.SSLHandshakeException : Received fatal alert: handshake_failure 使用自定义证书进行 HTTP GET

    laravel - 回滚 Laravel 中的一项特定迁移

    django - 如何重命名 Django 应用程序并将数据从一个应用程序迁移到另一个应用程序

    database - 如何使用flyway将数据从一个DB迁移到另一个DB?

    java - 如何使用 spring-boot-starter-data-r2dbc 启用连接池?

    java - 如何让 FlyWay 运行我的迁移? "Schema is up to date. No migration necessary."