在dropwizard中并行维护多个迁移文件

时间:2015-08-10 07:34:35

标签: hibernate migration liquibase dropwizard

我有一个dropwizard 0.8.1应用程序,它使用多个(两个)休眠驱动的数据库。但是,我想保持两个数据库的迁移捆绑包彼此分开。

怎么做?对于hibernate bundle,我可以设置name(),这样度量不会被注册两次同名,但似乎无法为迁移设置文件名......

2 个答案:

答案 0 :(得分:1)

此功能已添加到DW 1.0.0中。 它目前尚未发布,因此您可以使用快照。

目前来自github Migrations.rst

在此处复制相关部分:

支持添加多个迁移包

假设需要为两个不同的数据库进行迁移,则需要有两个不同的数据源工厂:

public class ExampleConfiguration extends Configuration {
@Valid
@NotNull
private DataSourceFactory database1 = new DataSourceFactory();

@Valid
@NotNull
private DataSourceFactory database2 = new DataSourceFactory();

@JsonProperty("database1")
public DataSourceFactory getDb1DataSourceFactory() {
    return database1;
}

@JsonProperty("database2")
public DataSourceFactory getDb2DataSourceFactory() {
    return database2;
}
}

现在可以添加多个迁移包,其名称如下:

@Override
public void initialize(Bootstrap<ExampleConfiguration> bootstrap) {
    bootstrap.addBundle(new MigrationsBundle<ExampleConfiguration>() {
        @Override
        public DataSourceFactory getDataSourceFactory(ExampleConfiguration configuration) {
            return configuration.getDb1DataSourceFactory();
        }

        @Override
        public String name() {
            return "db1";
        }
    });

    bootstrap.addBundle(new MigrationsBundle<ExampleConfiguration>() {
        @Override
        public DataSourceFactory getDataSourceFactory(ExampleConfiguration configuration) {
            return configuration.getDb2DataSourceFactory();
        }

        @Override
        public String name() {
            return "db2";
        }
    });
}

要迁移您的架构:

java -jar hello-world.jar db1 migrate helloworld.yml

java -jar hello-world.jar db2 migrate helloworld.yml

请注意

每当将名称添加到迁移捆绑包时,它就会成为需要在命令行运行的命令。例如:要检查数据库的状态,请使用status命令:

java -jar hello-world.jar db1 status helloworld.yml

java -jar hello-world.jar db2 status helloworld.yml

默认情况下,迁移捆绑包使用&#34; db&#34;命令。通过覆盖,您可以自定义它以提供您想要的任何名称并具有多个迁移捆绑包。无论在哪里&#34; db&#34;正在使用该命令,可以使用此自定义名称。

还需要提供不同的更改日志迁移文件。这可以作为

完成
java -jar hello-world.jar db1 migrate helloworld.yml --migrations <path_to_db1_migrations.xml>
java -jar hello-world.jar db2 migrate helloworld.yml --migrations <path_to_db2_migrations.xml>

答案 1 :(得分:0)

除了@SouravMitra's answer关于如何使用Dropwizard 1.0.0及更高版本定义多个迁移包之外:

如果要将多个数据库迁移更改日志维护为单独文件,但仍然打包在应用程序jar中而不必使用--migrations <external-file-path-to-migrations.xml>命令行参数引用它们,则可以配置通过覆盖getMigrationsFileName(),将changelog filename作为迁移包的一部分,如下所示:

@Override
public void initialize(Bootstrap<ExampleConfiguration> bootstrap) {
    bootstrap.addBundle(new MigrationsBundle<ExampleConfiguration>() {
        @Override
        public DataSourceFactory getDataSourceFactory(ExampleConfiguration configuration) {
            return configuration.getDb1DataSourceFactory();
        }

        @Override
        public String name() {
            return "db1";
        }

        @Override
        public String getMigrationsFileName() {
            return "migrations_db1.xml";
        }
    });

    bootstrap.addBundle(new MigrationsBundle<ExampleConfiguration>() {
        @Override
        public DataSourceFactory getDataSourceFactory(ExampleConfiguration configuration) {
            return configuration.getDb2DataSourceFactory();
        }

        @Override
        public String name() {
            return "db2";
        }

        @Override
        public String getMigrationsFileName() {
            return "migrations_db2.xml";
        }
    });

然后,以下命令将自动使用应用程序jar中打包的migrations_db1.xml中的migrations_db2.xmlsrc/main/resources迁移文件来迁移单独的数据库:

java -jar hello-world.jar db1 migrate helloworld.yml

java -jar hello-world.jar db2 migrate helloworld.yml